from IPython.display import Image
Valores missing, outlier y correlaciones¶
Elaborador por: Jacqueline Fernández Ramírez y Jazmín Fernández Ramírez.
Máster Universitario de Ciencia de Datos (MUCD), CUNEF.
En este notebook se realiza el estudio y preprocesamiento de las variables numéricas y categoricas. Se realizarán los siguientes pasos:
- Cambio de tipos de variables
- Separación en train y test
- Análisis de cada variable con gráficos descriptivos
- Para variables numericas: matriz de correlación, estudio de outliers y estudio de valores missing
- Para variables categoricas: relleno de valores missing, y estudio de correlaciones con vCramer
Para los valores outlier por columnas, se tendrá en cuenta los gráficos:
# <img src="images/analisis_outlier.png">
Image(filename="../images/analisis_outlier.png")
Dentro del tratamiento de los valores missing, se eligirá alguno de los siguientes métodos:
Image(filename="../images/missing.png")
Importación de librerías¶
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
import plotly.express as px
from sklearn.impute import KNNImputer
import scipy.stats as ss
import warnings
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_rows', 5000)
Funciones¶
En este trabajo se va a importar las funciones definidas en el archivo funciones_auxiliares.py mediante el prefijo f_aux. Por ejemplo, para llamar a la función plot_feature, se debe usar la sintaxis f_aux.plot_feature(...).
import os
print(os.getcwd())
C:\Users\jacki\OneDrive\Documentos\CUNEF\Aprendizaje_Automatico\practica1_EDA\practica1_EDA\notebooks
import funciones_auxiliares as f_aux
Lectura de datos del preprocesado inicial¶
Lectura de datos y cambio del tipo de variables
df_application = pd.read_csv("./data_preprocessing/bank_data_preprocessed.csv")
df_application.shape
(307511, 122)
df_application.columns
Index(['COMMONAREA_MEDI', 'COMMONAREA_AVG', 'COMMONAREA_MODE',
'NONLIVINGAPARTMENTS_MODE', 'NONLIVINGAPARTMENTS_AVG',
'NONLIVINGAPARTMENTS_MEDI', 'FONDKAPREMONT_MODE',
'LIVINGAPARTMENTS_MODE', 'LIVINGAPARTMENTS_AVG',
'LIVINGAPARTMENTS_MEDI',
...
'DAYS_ID_PUBLISH', 'DAYS_REGISTRATION', 'DAYS_EMPLOYED', 'DAYS_BIRTH',
'REGION_POPULATION_RELATIVE', 'NAME_HOUSING_TYPE', 'NAME_FAMILY_STATUS',
'NAME_EDUCATION_TYPE', 'NAME_INCOME_TYPE', 'SK_ID_CURR'],
dtype='object', length=122)
list_var_cat, other = f_aux.dame_variables_categoricas(dataset=df_application)
df_application[list_var_cat] = df_application[list_var_cat].astype("category")
list_var_continuous = list(df_application.select_dtypes('float').columns)
df_application[list_var_continuous] = df_application[list_var_continuous].astype(float)
df_application.dtypes
COMMONAREA_MEDI float64 COMMONAREA_AVG float64 COMMONAREA_MODE float64 NONLIVINGAPARTMENTS_MODE float64 NONLIVINGAPARTMENTS_AVG float64 NONLIVINGAPARTMENTS_MEDI float64 FONDKAPREMONT_MODE category LIVINGAPARTMENTS_MODE float64 LIVINGAPARTMENTS_AVG float64 LIVINGAPARTMENTS_MEDI float64 FLOORSMIN_AVG float64 FLOORSMIN_MODE float64 FLOORSMIN_MEDI float64 YEARS_BUILD_MEDI float64 YEARS_BUILD_MODE float64 YEARS_BUILD_AVG float64 OWN_CAR_AGE float64 LANDAREA_MEDI float64 LANDAREA_MODE float64 LANDAREA_AVG float64 BASEMENTAREA_MEDI float64 BASEMENTAREA_AVG float64 BASEMENTAREA_MODE float64 EXT_SOURCE_1 float64 NONLIVINGAREA_MODE float64 NONLIVINGAREA_AVG float64 NONLIVINGAREA_MEDI float64 ELEVATORS_MEDI float64 ELEVATORS_AVG float64 ELEVATORS_MODE float64 WALLSMATERIAL_MODE category APARTMENTS_MEDI float64 APARTMENTS_AVG float64 APARTMENTS_MODE float64 ENTRANCES_MEDI float64 ENTRANCES_AVG float64 ENTRANCES_MODE float64 LIVINGAREA_AVG float64 LIVINGAREA_MODE float64 LIVINGAREA_MEDI float64 HOUSETYPE_MODE category FLOORSMAX_MODE float64 FLOORSMAX_MEDI float64 FLOORSMAX_AVG float64 YEARS_BEGINEXPLUATATION_MODE float64 YEARS_BEGINEXPLUATATION_MEDI float64 YEARS_BEGINEXPLUATATION_AVG float64 TOTALAREA_MODE float64 EMERGENCYSTATE_MODE category OCCUPATION_TYPE category EXT_SOURCE_3 float64 AMT_REQ_CREDIT_BUREAU_HOUR float64 AMT_REQ_CREDIT_BUREAU_DAY float64 AMT_REQ_CREDIT_BUREAU_WEEK float64 AMT_REQ_CREDIT_BUREAU_MON float64 AMT_REQ_CREDIT_BUREAU_QRT float64 AMT_REQ_CREDIT_BUREAU_YEAR float64 NAME_TYPE_SUITE category OBS_30_CNT_SOCIAL_CIRCLE float64 DEF_30_CNT_SOCIAL_CIRCLE float64 OBS_60_CNT_SOCIAL_CIRCLE float64 DEF_60_CNT_SOCIAL_CIRCLE float64 EXT_SOURCE_2 float64 AMT_GOODS_PRICE float64 AMT_ANNUITY float64 CNT_FAM_MEMBERS float64 DAYS_LAST_PHONE_CHANGE float64 CNT_CHILDREN category FLAG_DOCUMENT_8 category NAME_CONTRACT_TYPE category CODE_GENDER category FLAG_OWN_CAR category FLAG_DOCUMENT_2 category FLAG_DOCUMENT_3 category FLAG_DOCUMENT_4 category FLAG_DOCUMENT_5 category FLAG_DOCUMENT_6 category FLAG_DOCUMENT_7 category FLAG_DOCUMENT_9 category FLAG_DOCUMENT_21 category FLAG_DOCUMENT_10 category FLAG_DOCUMENT_11 category FLAG_OWN_REALTY category FLAG_DOCUMENT_13 category FLAG_DOCUMENT_14 category FLAG_DOCUMENT_15 category FLAG_DOCUMENT_16 category FLAG_DOCUMENT_17 category FLAG_DOCUMENT_18 category FLAG_DOCUMENT_19 category FLAG_DOCUMENT_20 category FLAG_DOCUMENT_12 category AMT_CREDIT float64 AMT_INCOME_TOTAL float64 FLAG_PHONE category LIVE_CITY_NOT_WORK_CITY category REG_CITY_NOT_WORK_CITY category TARGET category REG_CITY_NOT_LIVE_CITY category LIVE_REGION_NOT_WORK_REGION category REG_REGION_NOT_WORK_REGION category REG_REGION_NOT_LIVE_REGION category HOUR_APPR_PROCESS_START category WEEKDAY_APPR_PROCESS_START category REGION_RATING_CLIENT_W_CITY category REGION_RATING_CLIENT category FLAG_EMAIL category FLAG_CONT_MOBILE category ORGANIZATION_TYPE category FLAG_WORK_PHONE category FLAG_EMP_PHONE category FLAG_MOBIL category DAYS_ID_PUBLISH int64 DAYS_REGISTRATION float64 DAYS_EMPLOYED int64 DAYS_BIRTH int64 REGION_POPULATION_RELATIVE float64 NAME_HOUSING_TYPE category NAME_FAMILY_STATUS category NAME_EDUCATION_TYPE category NAME_INCOME_TYPE category SK_ID_CURR int64 dtype: object
df_application.describe()
| COMMONAREA_MEDI | COMMONAREA_AVG | COMMONAREA_MODE | NONLIVINGAPARTMENTS_MODE | NONLIVINGAPARTMENTS_AVG | NONLIVINGAPARTMENTS_MEDI | LIVINGAPARTMENTS_MODE | LIVINGAPARTMENTS_AVG | LIVINGAPARTMENTS_MEDI | FLOORSMIN_AVG | FLOORSMIN_MODE | FLOORSMIN_MEDI | YEARS_BUILD_MEDI | YEARS_BUILD_MODE | YEARS_BUILD_AVG | OWN_CAR_AGE | LANDAREA_MEDI | LANDAREA_MODE | LANDAREA_AVG | BASEMENTAREA_MEDI | BASEMENTAREA_AVG | BASEMENTAREA_MODE | EXT_SOURCE_1 | NONLIVINGAREA_MODE | NONLIVINGAREA_AVG | NONLIVINGAREA_MEDI | ELEVATORS_MEDI | ELEVATORS_AVG | ELEVATORS_MODE | APARTMENTS_MEDI | APARTMENTS_AVG | APARTMENTS_MODE | ENTRANCES_MEDI | ENTRANCES_AVG | ENTRANCES_MODE | LIVINGAREA_AVG | LIVINGAREA_MODE | LIVINGAREA_MEDI | FLOORSMAX_MODE | FLOORSMAX_MEDI | FLOORSMAX_AVG | YEARS_BEGINEXPLUATATION_MODE | YEARS_BEGINEXPLUATATION_MEDI | YEARS_BEGINEXPLUATATION_AVG | TOTALAREA_MODE | EXT_SOURCE_3 | AMT_REQ_CREDIT_BUREAU_HOUR | AMT_REQ_CREDIT_BUREAU_DAY | AMT_REQ_CREDIT_BUREAU_WEEK | AMT_REQ_CREDIT_BUREAU_MON | AMT_REQ_CREDIT_BUREAU_QRT | AMT_REQ_CREDIT_BUREAU_YEAR | OBS_30_CNT_SOCIAL_CIRCLE | DEF_30_CNT_SOCIAL_CIRCLE | OBS_60_CNT_SOCIAL_CIRCLE | DEF_60_CNT_SOCIAL_CIRCLE | EXT_SOURCE_2 | AMT_GOODS_PRICE | AMT_ANNUITY | CNT_FAM_MEMBERS | DAYS_LAST_PHONE_CHANGE | AMT_CREDIT | AMT_INCOME_TOTAL | DAYS_ID_PUBLISH | DAYS_REGISTRATION | DAYS_EMPLOYED | DAYS_BIRTH | REGION_POPULATION_RELATIVE | SK_ID_CURR | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 92646.000000 | 92646.000000 | 92646.000000 | 93997.000000 | 93997.000000 | 93997.000000 | 97312.000000 | 97312.000000 | 97312.000000 | 98869.000000 | 98869.000000 | 98869.000000 | 103023.000000 | 103023.000000 | 103023.000000 | 104582.000000 | 124921.000000 | 124921.000000 | 124921.000000 | 127568.000000 | 127568.000000 | 127568.000000 | 134133.000000 | 137829.000000 | 137829.000000 | 137829.000000 | 143620.000000 | 143620.000000 | 143620.000000 | 151450.000000 | 151450.00000 | 151450.000000 | 152683.000000 | 152683.000000 | 152683.000000 | 153161.000000 | 153161.000000 | 153161.000000 | 154491.000000 | 154491.000000 | 154491.000000 | 157504.000000 | 157504.000000 | 157504.000000 | 159080.000000 | 246546.000000 | 265992.000000 | 265992.000000 | 265992.000000 | 265992.000000 | 265992.000000 | 265992.000000 | 306490.000000 | 306490.000000 | 306490.000000 | 306490.000000 | 3.068510e+05 | 3.072330e+05 | 307499.000000 | 307509.000000 | 307510.000000 | 3.075110e+05 | 3.075110e+05 | 307511.000000 | 307511.000000 | 307511.000000 | 307511.000000 | 307511.000000 | 307511.000000 |
| mean | 0.044595 | 0.044621 | 0.042553 | 0.008076 | 0.008809 | 0.008651 | 0.105645 | 0.100775 | 0.101954 | 0.231894 | 0.228058 | 0.231625 | 0.755746 | 0.759637 | 0.752471 | 12.061091 | 0.067169 | 0.064958 | 0.066333 | 0.087955 | 0.088442 | 0.087543 | 0.502130 | 0.027022 | 0.028358 | 0.028236 | 0.078078 | 0.078942 | 0.074490 | 0.117850 | 0.11744 | 0.114231 | 0.149213 | 0.149725 | 0.145193 | 0.107399 | 0.105975 | 0.108607 | 0.222315 | 0.225897 | 0.226282 | 0.977065 | 0.977752 | 0.977735 | 0.102547 | 0.510853 | 0.006402 | 0.007000 | 0.034362 | 0.267395 | 0.265474 | 1.899974 | 1.422245 | 0.143421 | 1.405292 | 0.100049 | 5.143927e-01 | 5.383962e+05 | 27108.573909 | 2.152665 | -962.858788 | 5.990260e+05 | 1.687979e+05 | -2994.202373 | -4986.120328 | 63815.045904 | -16036.995067 | 0.020868 | 278180.518577 |
| std | 0.076144 | 0.076036 | 0.074445 | 0.046276 | 0.047732 | 0.047415 | 0.097880 | 0.092576 | 0.093642 | 0.161380 | 0.161160 | 0.161934 | 0.112066 | 0.110111 | 0.113280 | 11.944812 | 0.082167 | 0.081750 | 0.081184 | 0.082179 | 0.082438 | 0.084307 | 0.211062 | 0.070254 | 0.069523 | 0.070166 | 0.134467 | 0.134576 | 0.132256 | 0.109076 | 0.10824 | 0.107936 | 0.100368 | 0.100049 | 0.100977 | 0.110565 | 0.111845 | 0.112260 | 0.143709 | 0.145067 | 0.144641 | 0.064575 | 0.059897 | 0.059223 | 0.107462 | 0.194844 | 0.083849 | 0.110757 | 0.204685 | 0.916002 | 0.794056 | 1.869295 | 2.400989 | 0.446698 | 2.379803 | 0.362291 | 1.910602e-01 | 3.694465e+05 | 14493.737315 | 0.910682 | 826.808487 | 4.024908e+05 | 2.371231e+05 | 1509.450419 | 3522.886321 | 141275.766519 | 4363.988632 | 0.013831 | 102790.175348 |
| min | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.014568 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.00000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000527 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 8.173617e-08 | 4.050000e+04 | 1615.500000 | 1.000000 | -4292.000000 | 4.500000e+04 | 2.565000e+04 | -7197.000000 | -24672.000000 | -17912.000000 | -25229.000000 | 0.000290 | 100002.000000 |
| 25% | 0.007900 | 0.007800 | 0.007200 | 0.000000 | 0.000000 | 0.000000 | 0.054200 | 0.050400 | 0.051300 | 0.083300 | 0.083300 | 0.083300 | 0.691400 | 0.699400 | 0.687200 | 5.000000 | 0.018700 | 0.016600 | 0.018700 | 0.043700 | 0.044200 | 0.040700 | 0.334007 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.058300 | 0.05770 | 0.052500 | 0.069000 | 0.069000 | 0.069000 | 0.045300 | 0.042700 | 0.045700 | 0.166700 | 0.166700 | 0.166700 | 0.976700 | 0.976700 | 0.976700 | 0.041200 | 0.370650 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 3.924574e-01 | 2.385000e+05 | 16524.000000 | 2.000000 | -1570.000000 | 2.700000e+05 | 1.125000e+05 | -4299.000000 | -7479.500000 | -2760.000000 | -19682.000000 | 0.010006 | 189145.500000 |
| 50% | 0.020800 | 0.021100 | 0.019000 | 0.000000 | 0.000000 | 0.000000 | 0.077100 | 0.075600 | 0.076100 | 0.208300 | 0.208300 | 0.208300 | 0.758500 | 0.764800 | 0.755200 | 9.000000 | 0.048700 | 0.045800 | 0.048100 | 0.075800 | 0.076300 | 0.074600 | 0.505998 | 0.001100 | 0.003600 | 0.003100 | 0.000000 | 0.000000 | 0.000000 | 0.086400 | 0.08760 | 0.084000 | 0.137900 | 0.137900 | 0.137900 | 0.074500 | 0.073100 | 0.074900 | 0.166700 | 0.166700 | 0.166700 | 0.981600 | 0.981600 | 0.981600 | 0.068800 | 0.535276 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 1.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 5.659614e-01 | 4.500000e+05 | 24903.000000 | 2.000000 | -757.000000 | 5.135310e+05 | 1.471500e+05 | -3254.000000 | -4504.000000 | -1213.000000 | -15750.000000 | 0.018850 | 278202.000000 |
| 75% | 0.051300 | 0.051500 | 0.049000 | 0.003900 | 0.003900 | 0.003900 | 0.131300 | 0.121000 | 0.123100 | 0.375000 | 0.375000 | 0.375000 | 0.825600 | 0.823600 | 0.823200 | 15.000000 | 0.086800 | 0.084100 | 0.085600 | 0.111600 | 0.112200 | 0.112400 | 0.675053 | 0.023100 | 0.027700 | 0.026600 | 0.120000 | 0.120000 | 0.120800 | 0.148900 | 0.14850 | 0.143900 | 0.206900 | 0.206900 | 0.206900 | 0.129900 | 0.125200 | 0.130300 | 0.333300 | 0.333300 | 0.333300 | 0.986600 | 0.986600 | 0.986600 | 0.127600 | 0.669057 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 3.000000 | 2.000000 | 0.000000 | 2.000000 | 0.000000 | 6.636171e-01 | 6.795000e+05 | 34596.000000 | 3.000000 | -274.000000 | 8.086500e+05 | 2.025000e+05 | -1720.000000 | -2010.000000 | -289.000000 | -12413.000000 | 0.028663 | 367142.500000 |
| max | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 91.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 0.962693 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.00000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 0.896010 | 4.000000 | 9.000000 | 8.000000 | 27.000000 | 261.000000 | 25.000000 | 348.000000 | 34.000000 | 344.000000 | 24.000000 | 8.549997e-01 | 4.050000e+06 | 258025.500000 | 20.000000 | 0.000000 | 4.050000e+06 | 1.170000e+08 | 0.000000 | 0.000000 | 365243.000000 | -7489.000000 | 0.072508 | 456255.000000 |
Separación en train y test estratificado¶
pd_plot_target_status = df_application['TARGET']\
.value_counts(normalize=True)\
.mul(100).rename('percent').reset_index()
pd_plot_target_status_conteo = df_application['TARGET'].value_counts().reset_index()
pd_plot_target_status_pc = pd.merge(pd_plot_target_status,
pd_plot_target_status_conteo, on=['index'], how='inner')
fig = px.histogram(pd_plot_target_status_pc, x="index", y=['percent'])
fig.show()
from sklearn.model_selection import train_test_split
X_df_application, X_df_application_test, y_df_application, y_df_application_test = train_test_split(df_application.drop('TARGET',axis=1),
df_application['TARGET'],
stratify=df_application['TARGET'],
test_size=0.2)
df_application_train = pd.concat([X_df_application, y_df_application],axis=1)
df_application_test = pd.concat([X_df_application_test, y_df_application_test],axis=1)
print('== Train\n', df_application_train['TARGET'].value_counts(normalize=True))
print('== Test\n', df_application_test['TARGET'].value_counts(normalize=True))
== Train 0 0.919271 1 0.080729 Name: TARGET, dtype: float64 == Test 0 0.919272 1 0.080728 Name: TARGET, dtype: float64
En el presente código, se llevó a cabo un estudio minucioso de la variable objetivo TARGET para entender su distribución y tratar el desequilibrio notable existente. En un principio, se determinó la distribución porcentual y la totalidad de cada clase de TARGET en el DataFrame df_application. Esto hizo evidente que el 91.93% de los registros son de la clase 0 y únicamente el 8.07% pertenecen a la clase 1. Se aplicó una separación estratificada para preservar la proporción de clases en los conjuntos de datos de entrenamiento y prueba. De este modo, se empleó la función train_test_split de sklearn, garantizando una representación justa de ambas clases en los datos de entrenamiento y prueba.
Por otro lado, para confirmar la estratificación, se comprobaron las proporciones de cada clase en los dos grupos. Los hallazgos corroboraron que las distribuciones de TARGET se conservaron constantes tanto en los datos de entrenamiento como en los de prueba, lo cual es vital para prevenir prejuicios en el modelo y asegurar una valoración equitativa. Este cuidadoso enfoque en la separación y validación de los datos es esencial para garantizar la robustez y exactitud de los modelos de aprendizaje automático que se formarán en dichos datos. Por lo tanto, se asegura que el modelo pueda generalizar adecuadamente nuevos datos y ofrecer proyecciones confiables.
Visualización descriptiva de los datos¶
Veo el número de valores nulos por filas y por columnas
pd_series_null_columns = df_application_train.isnull().sum().sort_values(ascending=False)
pd_series_null_rows = df_application_train.isnull().sum(axis=1).sort_values(ascending=False)
print(pd_series_null_columns.shape, pd_series_null_rows.shape)
pd_null_columnas = pd.DataFrame(pd_series_null_columns, columns=['nulos_columnas'])
pd_null_filas = pd.DataFrame(pd_series_null_rows, columns=['nulos_filas'])
pd_null_filas['target'] = df_application['TARGET'].copy()
pd_null_columnas['porcentaje_columnas'] = pd_null_columnas['nulos_columnas']/df_application_train.shape[0]
pd_null_filas['porcentaje_filas']= pd_null_filas['nulos_filas']/df_application_train.shape[1]
(122,) (246008,)
pd_null_columnas
| nulos_columnas | porcentaje_columnas | |
|---|---|---|
| COMMONAREA_MEDI | 171807 | 0.698380 |
| COMMONAREA_MODE | 171807 | 0.698380 |
| COMMONAREA_AVG | 171807 | 0.698380 |
| NONLIVINGAPARTMENTS_MODE | 170790 | 0.694246 |
| NONLIVINGAPARTMENTS_MEDI | 170790 | 0.694246 |
| NONLIVINGAPARTMENTS_AVG | 170790 | 0.694246 |
| FONDKAPREMONT_MODE | 168105 | 0.683331 |
| LIVINGAPARTMENTS_AVG | 168087 | 0.683258 |
| LIVINGAPARTMENTS_MEDI | 168087 | 0.683258 |
| LIVINGAPARTMENTS_MODE | 168087 | 0.683258 |
| FLOORSMIN_AVG | 166825 | 0.678128 |
| FLOORSMIN_MODE | 166825 | 0.678128 |
| FLOORSMIN_MEDI | 166825 | 0.678128 |
| YEARS_BUILD_MODE | 163534 | 0.664751 |
| YEARS_BUILD_AVG | 163534 | 0.664751 |
| YEARS_BUILD_MEDI | 163534 | 0.664751 |
| OWN_CAR_AGE | 162385 | 0.660080 |
| LANDAREA_MODE | 145926 | 0.593176 |
| LANDAREA_AVG | 145926 | 0.593176 |
| LANDAREA_MEDI | 145926 | 0.593176 |
| BASEMENTAREA_MEDI | 143829 | 0.584652 |
| BASEMENTAREA_AVG | 143829 | 0.584652 |
| BASEMENTAREA_MODE | 143829 | 0.584652 |
| EXT_SOURCE_1 | 138768 | 0.564079 |
| NONLIVINGAREA_MODE | 135623 | 0.551295 |
| NONLIVINGAREA_AVG | 135623 | 0.551295 |
| NONLIVINGAREA_MEDI | 135623 | 0.551295 |
| ELEVATORS_AVG | 130988 | 0.532454 |
| ELEVATORS_MODE | 130988 | 0.532454 |
| ELEVATORS_MEDI | 130988 | 0.532454 |
| WALLSMATERIAL_MODE | 124941 | 0.507874 |
| APARTMENTS_MEDI | 124761 | 0.507142 |
| APARTMENTS_AVG | 124761 | 0.507142 |
| APARTMENTS_MODE | 124761 | 0.507142 |
| ENTRANCES_MEDI | 123732 | 0.502959 |
| ENTRANCES_AVG | 123732 | 0.502959 |
| ENTRANCES_MODE | 123732 | 0.502959 |
| LIVINGAREA_AVG | 123365 | 0.501467 |
| LIVINGAREA_MODE | 123365 | 0.501467 |
| LIVINGAREA_MEDI | 123365 | 0.501467 |
| HOUSETYPE_MODE | 123312 | 0.501252 |
| FLOORSMAX_MODE | 122323 | 0.497232 |
| FLOORSMAX_MEDI | 122323 | 0.497232 |
| FLOORSMAX_AVG | 122323 | 0.497232 |
| YEARS_BEGINEXPLUATATION_AVG | 119906 | 0.487407 |
| YEARS_BEGINEXPLUATATION_MODE | 119906 | 0.487407 |
| YEARS_BEGINEXPLUATATION_MEDI | 119906 | 0.487407 |
| TOTALAREA_MODE | 118657 | 0.482330 |
| EMERGENCYSTATE_MODE | 116520 | 0.473643 |
| OCCUPATION_TYPE | 77090 | 0.313364 |
| EXT_SOURCE_3 | 48722 | 0.198050 |
| AMT_REQ_CREDIT_BUREAU_HOUR | 33156 | 0.134776 |
| AMT_REQ_CREDIT_BUREAU_DAY | 33156 | 0.134776 |
| AMT_REQ_CREDIT_BUREAU_WEEK | 33156 | 0.134776 |
| AMT_REQ_CREDIT_BUREAU_MON | 33156 | 0.134776 |
| AMT_REQ_CREDIT_BUREAU_QRT | 33156 | 0.134776 |
| AMT_REQ_CREDIT_BUREAU_YEAR | 33156 | 0.134776 |
| NAME_TYPE_SUITE | 1044 | 0.004244 |
| OBS_60_CNT_SOCIAL_CIRCLE | 792 | 0.003219 |
| DEF_60_CNT_SOCIAL_CIRCLE | 792 | 0.003219 |
| DEF_30_CNT_SOCIAL_CIRCLE | 792 | 0.003219 |
| OBS_30_CNT_SOCIAL_CIRCLE | 792 | 0.003219 |
| EXT_SOURCE_2 | 509 | 0.002069 |
| AMT_GOODS_PRICE | 234 | 0.000951 |
| AMT_ANNUITY | 9 | 0.000037 |
| CNT_FAM_MEMBERS | 2 | 0.000008 |
| DAYS_LAST_PHONE_CHANGE | 1 | 0.000004 |
| HOUR_APPR_PROCESS_START | 0 | 0.000000 |
| FLAG_EMAIL | 0 | 0.000000 |
| REGION_RATING_CLIENT | 0 | 0.000000 |
| REGION_RATING_CLIENT_W_CITY | 0 | 0.000000 |
| WEEKDAY_APPR_PROCESS_START | 0 | 0.000000 |
| REG_CITY_NOT_LIVE_CITY | 0 | 0.000000 |
| REG_REGION_NOT_LIVE_REGION | 0 | 0.000000 |
| REG_REGION_NOT_WORK_REGION | 0 | 0.000000 |
| LIVE_REGION_NOT_WORK_REGION | 0 | 0.000000 |
| ORGANIZATION_TYPE | 0 | 0.000000 |
| REG_CITY_NOT_WORK_CITY | 0 | 0.000000 |
| FLAG_CONT_MOBILE | 0 | 0.000000 |
| FLAG_MOBIL | 0 | 0.000000 |
| FLAG_WORK_PHONE | 0 | 0.000000 |
| FLAG_EMP_PHONE | 0 | 0.000000 |
| FLAG_PHONE | 0 | 0.000000 |
| DAYS_ID_PUBLISH | 0 | 0.000000 |
| DAYS_REGISTRATION | 0 | 0.000000 |
| DAYS_EMPLOYED | 0 | 0.000000 |
| DAYS_BIRTH | 0 | 0.000000 |
| REGION_POPULATION_RELATIVE | 0 | 0.000000 |
| NAME_HOUSING_TYPE | 0 | 0.000000 |
| NAME_FAMILY_STATUS | 0 | 0.000000 |
| NAME_EDUCATION_TYPE | 0 | 0.000000 |
| NAME_INCOME_TYPE | 0 | 0.000000 |
| SK_ID_CURR | 0 | 0.000000 |
| LIVE_CITY_NOT_WORK_CITY | 0 | 0.000000 |
| FLAG_DOCUMENT_12 | 0 | 0.000000 |
| AMT_INCOME_TOTAL | 0 | 0.000000 |
| FLAG_DOCUMENT_9 | 0 | 0.000000 |
| CNT_CHILDREN | 0 | 0.000000 |
| FLAG_DOCUMENT_8 | 0 | 0.000000 |
| NAME_CONTRACT_TYPE | 0 | 0.000000 |
| CODE_GENDER | 0 | 0.000000 |
| FLAG_OWN_CAR | 0 | 0.000000 |
| FLAG_DOCUMENT_2 | 0 | 0.000000 |
| FLAG_DOCUMENT_3 | 0 | 0.000000 |
| FLAG_DOCUMENT_4 | 0 | 0.000000 |
| FLAG_DOCUMENT_5 | 0 | 0.000000 |
| FLAG_DOCUMENT_6 | 0 | 0.000000 |
| FLAG_DOCUMENT_7 | 0 | 0.000000 |
| FLAG_DOCUMENT_21 | 0 | 0.000000 |
| AMT_CREDIT | 0 | 0.000000 |
| FLAG_DOCUMENT_10 | 0 | 0.000000 |
| FLAG_DOCUMENT_11 | 0 | 0.000000 |
| FLAG_OWN_REALTY | 0 | 0.000000 |
| FLAG_DOCUMENT_13 | 0 | 0.000000 |
| FLAG_DOCUMENT_14 | 0 | 0.000000 |
| FLAG_DOCUMENT_15 | 0 | 0.000000 |
| FLAG_DOCUMENT_16 | 0 | 0.000000 |
| FLAG_DOCUMENT_17 | 0 | 0.000000 |
| FLAG_DOCUMENT_18 | 0 | 0.000000 |
| FLAG_DOCUMENT_19 | 0 | 0.000000 |
| FLAG_DOCUMENT_20 | 0 | 0.000000 |
| TARGET | 0 | 0.000000 |
pd_null_filas.head()
| nulos_filas | target | porcentaje_filas | |
|---|---|---|---|
| 69707 | 61 | 0 | 0.5 |
| 269492 | 61 | 0 | 0.5 |
| 150206 | 61 | 0 | 0.5 |
| 116937 | 61 | 0 | 0.5 |
| 244833 | 61 | 0 | 0.5 |
En este apartado, pd_series_null_columns y pd_series_null_rows, determinan la cantidad total de valores nulos en cada columna y fila, respectivamente, y las organizan de manera descendente para detectar con eficacia las columnas y filas con mayor cantidad de valores nulos. Cabe mencionar que, detectar la ubicación de los valores nulos es esencial para el siguiente paso en la gestión de datos, debido a que facilita la toma de decisiones fundamentadas respecto a si se deben modificar filas/columnas, atribuir valores nulos o tratar los nulos de una forma distinta.
Distribución del resto de variables¶
import matplotlib.pyplot as plt
import seaborn as sns
import time
import gc
import psutil
import numpy as np
def set_plot_style():
"""Configura el estilo general de los gráficos"""
sns.set_style("whitegrid")
plt.rcParams['figure.dpi'] = 100
plt.rcParams['font.size'] = 10
plt.rcParams['axes.titlesize'] = 12
plt.rcParams['axes.labelsize'] = 10
plt.rcParams['xtick.labelsize'] = 9
plt.rcParams['ytick.labelsize'] = 9
def clear_memory():
"""Limpia la memoria"""
plt.close('all')
gc.collect()
def optimize_figure_size(n_categories, label_length):
"""Optimiza el tamaño de la figura"""
if n_categories > 10 or label_length > 15:
return (15, 6)
return (12, 5)
def plot_feature(df, col_name, isContinuous, target, max_categories=15, sample_size=50000):
"""
Función para crear gráficos exploratorios personalizados con Seaborn, optimizando su diseño según las
características de la variable analizada (continua o categórica) y su relación con la variable objetivo.
Parámetros:
-----------
- df : pandas.DataFrame
El conjunto de datos que contiene las variables a analizar.
- col_name : str
Nombre de la columna a analizar dentro del DataFrame.
- isContinuous : bool
Indica si la columna es una variable continua (`True`) o categórica (`False`).
- target : str
Nombre de la variable objetivo con la que se analizará la relación de la columna.
- max_categories : int, opcional (default=15)
Número máximo de categorías a visualizar para variables categóricas (las categorías con menor frecuencia serán excluidas si se excede este límite).
- sample_size : int, opcional (default=50000)
Tamaño máximo de la muestra a utilizar para optimizar el rendimiento en conjuntos de datos grandes.
Salida:
-------
- fig : matplotlib.figure.Figure
Figura generada con los gráficos. Si ocurre un error durante la generación de los gráficos,
se devuelve `None`.
Descripción del Proceso:
------------------------
1. **Reducción de datos para conjuntos grandes**: Si el número de filas del DataFrame supera
`sample_size`, se toma una muestra aleatoria para optimizar la velocidad de procesamiento.
2. **Ajuste del tamaño de la figura**: El tamaño de los gráficos se calcula dinámicamente en función
del número de valores únicos en la columna analizada (`col_name`) y la longitud de sus etiquetas.
3. **Gráficos para variables continuas**:
- **Histograma**: Muestra la distribución de la variable. Incluye líneas para la media y la mediana.
- **Boxplot**: Visualiza la distribución de la variable por categorías de la variable objetivo.
4. **Gráficos para variables categóricas**:
- **Conteo de categorías**: Muestra la frecuencia de las principales categorías.
- **Proporción por target**: Visualiza la proporción de la variable objetivo en función de las categorías.
5. **Limpieza de outliers (para continuas)**: Se excluyen valores extremos utilizando los percentiles
1 y 99.
6. **Control de etiquetas y rotación**: Se optimizan las etiquetas del eje X para mejorar la legibilidad,
ajustando la rotación según la longitud de las etiquetas y el número de categorías.
Uso recomendado:
-----------------
Utiliza esta función para el análisis exploratorio de datos (EDA), cuando necesites entender:
- La distribución de una variable continua o categórica.
- La relación entre una variable independiente y la variable objetivo.
Manejo de errores:
------------------
Si ocurre un error durante la ejecución (por ejemplo, si una columna no existe en el DataFrame o si
el tipo de dato no es adecuado), la función cierra la figura creada y devuelve `None`.
"""
# Muestreo si el dataset es grande
if len(df) > sample_size:
df = df.sample(n=sample_size, random_state=42)
# Calcular métricas para el tamaño
n_unique = len(df[col_name].unique())
max_label_len = df[col_name].astype(str).str.len().max()
figsize = optimize_figure_size(n_unique, max_label_len)
# Crear figura
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=figsize)
# Paleta de colores personalizada
palette = sns.color_palette(['#2ecc71', '#e74c3c', '#3498db'])
try:
# Calcular información de nulos
nulls = df[col_name].isnull().sum()
null_pct = (nulls / len(df)) * 100
if isContinuous:
# Limpiar outliers
q1, q3 = df[col_name].quantile([0.01, 0.99])
df_clean = df[(df[col_name] >= q1) & (df[col_name] <= q3)]
# Gráfico de distribución
sns.histplot(
data=df_clean,
x=col_name,
ax=ax1,
color=palette[0],
kde=True,
bins=30
)
# Añadir líneas de media y mediana
mean_val = df_clean[col_name].mean()
median_val = df_clean[col_name].median()
ax1.axvline(mean_val, color=palette[1], linestyle='--', label=f'Media: {mean_val:.2f}')
ax1.axvline(median_val, color=palette[2], linestyle='--', label=f'Mediana: {median_val:.2f}')
ax1.legend(fontsize=8)
# Boxplot
sns.boxplot(
x=target,
y=col_name,
data=df_clean,
ax=ax2,
palette=[palette[0], palette[1]]
)
else:
# Limitar categorías para variables categóricas
value_counts = df[col_name].value_counts()
if len(value_counts) > max_categories:
top_cats = value_counts.nlargest(max_categories).index
df = df[df[col_name].isin(top_cats)]
value_counts = value_counts[top_cats]
# Gráfico de conteo
sns.countplot(
data=df,
x=col_name,
order=value_counts.index,
ax=ax1,
color=palette[0]
)
# Gráfico de proporción por target
target_props = df.groupby(col_name)[target].value_counts(normalize=True).unstack()
target_props.plot(
kind='bar',
ax=ax2,
color=[palette[0], palette[1]],
width=0.8
)
ax2.set_ylabel(f'Proporción de {target}')
# Configurar títulos y etiquetas
ax1.set_title(f'Distribución de {col_name}\nNulos: {nulls:,} ({null_pct:.1f}%)')
ax2.set_title(f'Relación con {target}')
# Ajustar etiquetas
for ax in [ax1, ax2]:
if not isContinuous:
labels = ax.get_xticklabels()
if len(labels) > 0:
max_len = max(len(str(l.get_text())) for l in labels)
rotation = 90 if max_len > 10 or len(labels) > 5 else 45
ax.set_xticklabels(
labels,
rotation=rotation,
ha='right' if rotation == 90 else 'right',
fontsize=8
)
# Ajustar grid
ax.grid(True, alpha=0.3)
# Ajustar límites
if not isContinuous:
ax.set_xlabel(col_name, fontsize=9)
# Ajustar espacio
plt.tight_layout()
return fig
except Exception as e:
plt.close(fig)
print(f"Error en {col_name}: {str(e)}")
return None
def plot_all_features(df, target_col='TARGET', batch_size=3, memory_threshold=85):
"""
Función para generar gráficos exploratorios de todas las características de un conjunto de datos,
optimizando el uso de recursos de memoria y procesando las columnas en lotes.
Parámetros:
-----------
- df : pandas.DataFrame
El conjunto de datos que contiene las características y la variable objetivo.
- target_col : str, opcional (default='TARGET')
Nombre de la columna objetivo con la cual se analizará la relación de las demás características.
- batch_size : int, opcional (default=3)
Número de columnas a procesar simultáneamente en cada lote para optimizar el rendimiento.
- memory_threshold : int, opcional (default=85)
Porcentaje máximo de uso de memoria permitido antes de forzar la limpieza de recursos.
Descripción del Proceso:
------------------------
1. **Configuración inicial**:
- Configura el estilo visual para los gráficos utilizando una función personalizada (`set_plot_style`).
- Excluye la columna objetivo (`target_col`) de la lista de columnas a procesar.
- Calcula el número total de columnas a analizar.
2. **Procesamiento por lotes**:
- Divide las columnas en lotes (`batch_size`) para evitar sobrecargar la memoria en datasets grandes.
- Antes de procesar un lote, verifica el uso de memoria utilizando `psutil.virtual_memory()`.
- Si el uso de memoria excede el umbral definido (`memory_threshold`), fuerza la limpieza de memoria
invocando `clear_memory()`.
3. **Generación de gráficos**:
- Para cada columna del lote:
- Determina si es una variable continua o categórica, basándose en su tipo de datos y el número de
valores únicos.
- Llama a la función `plot_feature` para generar los gráficos correspondientes. Si la función devuelve
un gráfico válido, este se muestra y se cierra para liberar recursos.
- Limpia la memoria después de procesar cada columna para optimizar el uso de recursos.
4. **Pausa entre lotes**:
- Introduce un breve retraso entre lotes para evitar sobrecargar el sistema, especialmente útil en entornos
con recursos limitados.
5. **Manejo de errores**:
- Captura excepciones generadas por columnas individuales y continúa procesando las demás,
asegurando que el proceso no se detenga por errores aislados.
- Permite la interrupción manual mediante un `KeyboardInterrupt` (Ctrl + C), asegurando la limpieza de
recursos antes de finalizar.
Salida:
-------
- Muestra en pantalla los gráficos generados para cada columna y los cierra automáticamente para optimizar
el uso de memoria.
- Imprime mensajes en la consola para informar sobre el progreso del análisis (lotes procesados, columnas
con errores, etc.).
Uso recomendado:
-----------------
Esta función es ideal para realizar análisis exploratorio de datos (EDA) cuando:
- Trabajas con un conjunto de datos con un gran número de características.
- Necesitas automatizar la generación de gráficos para todas las columnas, optimizando el uso de recursos.
- Quieres identificar patrones generales en la relación entre las características y la variable objetivo.
Manejo de errores:
------------------
- Si una columna no puede procesarse por cualquier motivo (como valores no válidos o errores inesperados),
la función imprime el error en consola y continúa con la siguiente columna.
- Permite interrumpir el proceso manualmente mediante Ctrl + C, asegurando la limpieza de memoria al finalizar.
"""
# Configurar estilo
set_plot_style()
# Preparar columnas
columns = [col for col in df.columns if col != target_col]
total_cols = len(columns)
print(f"Iniciando análisis de {total_cols} características")
try:
for i in range(0, total_cols, batch_size):
# Verificar memoria
if psutil.virtual_memory().percent > memory_threshold:
clear_memory()
print("\nLimpiando memoria...")
time.sleep(2)
batch_cols = columns[i:i + batch_size]
print(f"\nProcesando lote {i//batch_size + 1} de {(total_cols + batch_size - 1)//batch_size}")
for col in batch_cols:
try:
# Determinar tipo de variable
is_continuous = (
df[col].dtype in [float, int] and
len(df[col].unique()) > 10
)
# Crear gráfico
fig = plot_feature(
df=df,
col_name=col,
isContinuous=is_continuous,
target=target_col,
max_categories=15, # Límite de categorías
sample_size=50000 # Límite de registros
)
if fig is not None:
plt.show()
plt.close(fig)
# Limpiar memoria
clear_memory()
except Exception as e:
print(f"Error procesando {col}: {str(e)}")
continue
# Pausa entre lotes
time.sleep(1)
print("\nProceso completado exitosamente.")
except KeyboardInterrupt:
print("\nProceso interrumpido por el usuario.")
clear_memory()
finally:
clear_memory()
# Ejecutar la visualización
plot_all_features(
df=df_application_train,
target_col='TARGET',
batch_size=3, # 3 gráficos por lote
memory_threshold=85 # Limpiar memoria al 85%
)
Iniciando análisis de 121 características Limpiando memoria... Procesando lote 1 de 41
Limpiando memoria... Procesando lote 2 de 41
Limpiando memoria... Procesando lote 3 de 41
Limpiando memoria... Procesando lote 4 de 41
Limpiando memoria... Procesando lote 5 de 41
Limpiando memoria... Procesando lote 6 de 41
Limpiando memoria... Procesando lote 7 de 41
Limpiando memoria... Procesando lote 8 de 41
Limpiando memoria... Procesando lote 9 de 41
Limpiando memoria... Procesando lote 10 de 41
Limpiando memoria... Procesando lote 11 de 41
Limpiando memoria... Procesando lote 12 de 41
Limpiando memoria... Procesando lote 13 de 41
Limpiando memoria... Procesando lote 14 de 41
Limpiando memoria... Procesando lote 15 de 41
Limpiando memoria... Procesando lote 16 de 41
Limpiando memoria... Procesando lote 17 de 41
Error en OCCUPATION_TYPE: operands could not be broadcast together with shape (18,) (15,)
Limpiando memoria... Procesando lote 18 de 41
Limpiando memoria... Procesando lote 19 de 41
Limpiando memoria... Procesando lote 20 de 41
Limpiando memoria... Procesando lote 21 de 41
Limpiando memoria... Procesando lote 22 de 41
Limpiando memoria... Procesando lote 23 de 41
Error en CNT_CHILDREN: operands could not be broadcast together with shape (15,) (9,)
Limpiando memoria... Procesando lote 24 de 41
Limpiando memoria... Procesando lote 25 de 41
Limpiando memoria... Procesando lote 26 de 41
Limpiando memoria... Procesando lote 27 de 41
Limpiando memoria... Procesando lote 28 de 41
Limpiando memoria... Procesando lote 29 de 41
Limpiando memoria... Procesando lote 30 de 41
Limpiando memoria... Procesando lote 31 de 41
Limpiando memoria... Procesando lote 32 de 41
Limpiando memoria... Procesando lote 33 de 41
Limpiando memoria... Procesando lote 34 de 41
Error en HOUR_APPR_PROCESS_START: operands could not be broadcast together with shape (24,) (15,) Limpiando memoria... Procesando lote 35 de 41
Limpiando memoria... Procesando lote 36 de 41
Error en ORGANIZATION_TYPE: operands could not be broadcast together with shape (58,) (15,) Limpiando memoria... Procesando lote 37 de 41
Error en FLAG_MOBIL: Length of passed values is 2, index implies 4. Limpiando memoria... Procesando lote 38 de 41
Limpiando memoria... Procesando lote 39 de 41
Limpiando memoria... Procesando lote 40 de 41 Error en NAME_FAMILY_STATUS: operands could not be broadcast together with shape (6,) (5,)
Error en NAME_INCOME_TYPE: operands could not be broadcast together with shape (8,) (6,) Limpiando memoria... Procesando lote 41 de 41
Proceso completado exitosamente.
Análisis de los gráficos¶
El código establece el estilo de los gráficos y maximiza la utilización de la memoria al generar visualizaciones para cada elemento del dataset df_application_train. La función plot_feature produce gráficos concretos basados en la categoría de variable (continua o categórica) y proporciona una perspectiva minuciosa de la distribución de cada característica y su vínculo con la variable meta (TARGET). Esto comprende diagramas de distribución y boxplots para variables continuas, al igual que diagramas de conteo y proporciones para variables categóricas. Mediante el uso de una gama de colores a medida y la modificación automática del tamaño de las figuras, se garantiza que las visualizaciones sean nítidas y entendibles.
La función principal plot_all_features gestiona el análisis por lotes, facilitando el procesamiento y visualización de grandes datasets sin saturar la memoria del sistema. Este método, mediante la comprobación del uso de memoria y la limpieza periódica de los recursos, garantiza que el análisis sea eficaz y sostenible. Adicionalmente, la selección de grandes datasets incrementa la rapidez y el desempeño del análisis sin comprometer la representatividad de los datos.
Por último, se recalca que a partir de estos gráficos se puede analizar las distribuciones de las variables y su relación con la variable objetivo "TARGET". Entre los principales resultados se encuentra:
EXT_SOURCE_1: El gráfico de la variable EXT_SOURCE_1 revela que presenta una distribución bastante equilibrada con una leve tendencia hacia el valor medio. Además, los clientes con valores superiores en EXT_SOURCE_1 tienen una probabilidad menor de incurrir en el TARGET, es decir que los clientes con valores superiores en EXT_SOURCE_1 suelen tener un riesgo asociado más bajo, lo que indica que esta variable podría ser un indicador significativo para medir la probabilidad de cumplimiento de pagos.
NAME_CONTRACT_TYPE: La gráfica de la variable NAME_CONTRACT_TYPE muestra que los "Cash loans" (préstamos en efectivo) son significativamente más comunes que los "Revolving loans" (créditos renovables). Los "Cash loans" son préstamos otorgados en una suma fija que los clientes deben devolver en cuotas preestablecidas, mientras que los "Revolving loans" permiten a los clientes retirar fondos hasta un límite acordado y pagar en función del monto utilizado. A partir de esto, de acuerdo con la variable objetivo se comprueba que es más usual tener un retraso en el pago del préstamo en "cash loans", lo cual se puede deber a que estos préstamos suelen ser por montos más grandes y específicos, lo que puede representar una carga financiera más significativa para el prestatario. Por su parte, en los "revolving loans", el prestatario solo está obligado a pagar un mínimo cada mes, lo que puede incentivar un pago más regular, aunque sea pequeño.
NAME_EDUCATION_TYPE: Los datos indican que los individuos con grados de educación superior tienen menos tendencia a postergar los pagos de los préstamos. Primero, en los pagos aplazados (1 en rojo), se nota una reducción considerable en la proporción de los pagos aplazados conforme se eleva el nivel de educación. Por ejemplo, los individuos con educación superior y grado académico presentan una proporción significativamente inferior de pagos demorados en comparación con los que poseen "Secondary / secondary especial" o "Lower secondary". En contraste, en los pagos sin demora (0 en verde), la proporción de pagos sin demora se incrementa con grados educativos superiores, lo que indica una correlación positiva entre el pago y la formación académica.
DAYS_EMPLOYED: El gráfico de la variable DAYS_EMPLOYED indica que conforme se incrementa la cantidad de días empleados, la proporción de clientes con TARGET equivalente a 0 también se incrementa de manera notable. Esto es comprensible ya que los individuos que han estado trabajando durante un periodo prolongado suelen poseer una mayor estabilidad económica y un ingreso constante, lo que disminuye la probabilidad de incumplimiento de pagos. Además, las capacidades y experiencia obtenidas durante un trabajo extendido pueden convertirse en mejores oportunidades de empleo y una mayor habilidad para gestionar deudas.
AMT_CREDIT: La gráfica de la variable AMT_CREDIT indica que las cantidades de crédito generalmente se encuentran en un rango de bajo a medio, con picos en determinados intervalos que representan los valores más habituales. Los clientes que no enfrentan dificultades de pago (TARGET=0) suelen poseer créditos más elevados y repartidos en una gama más extensa en contraste con los que tienen dificultades de pago (TARGET=1). Esto indica que los clientes con créditos más elevados, probablemente debido a condiciones financieras más favorables, tienen menos posibilidad de no cumplir con sus obligaciones de pago.
AMT_INCOME_TOTAL: El gráfico de la variable AMT_INCOME_TOTAL indica que la mayor parte de los ingresos totales de las personas se sitúan en un intervalo de bajo a medio. El promedio de los ingresos se sitúa cerca de 185,838.27, mientras que la mediana es de 144,000. Esto señala que existen algunas personas con ingresos considerablemente elevados que superan el promedio. En relación con la variable TARGET, el diagrama de caja (boxplot) muestra que las personas sin dificultades de pago (TARGET=0) suelen tener ingresos más elevados y repartidos en un espectro más extenso en contraste con las que tienen dificultades de pago (TARGET=1). Esto indica que los clientes con ingresos superiores tienen una probabilidad reducida de incumplir con sus pagos, posiblemente debido a una mayor estabilidad económica.
NAME_HOUSING_TYPE: A partir del gráfico, se analiza que la variable NAME_HOUSING_TYPE exhibe la distribución de los diferentes tipos de vivienda y su vínculo con la variable TARGET. El diagrama a la izquierda muestra que "House / apartment" es la categoría de vivienda más habitual, con más de 40,000 casos, seguida por "With parents" y otras categorías menos comunes como "Municipal apartment" y "Rented apartment". El gráfico de la derecha resalta que los dos grupos con las proporciones más elevadas de clientes con dificultades de pago (TARGET=1) son "Apartamento alquilado" y "Con padres", lo que indica que residir en apartamentos alquilados o con padres podría estar vinculado a una mayor posibilidad de incumplimiento de pagos, probablemente debido a una estabilidad financiera inferior a la de aquellos que poseen o alquilan viviendas de otro tipo.
Tratamiento de variables continuas¶
A continuación, se tratan los valores missing, las correlaciones de las variables continuas y los outlier
list_var_continuous
['COMMONAREA_MEDI', 'COMMONAREA_AVG', 'COMMONAREA_MODE', 'NONLIVINGAPARTMENTS_MODE', 'NONLIVINGAPARTMENTS_AVG', 'NONLIVINGAPARTMENTS_MEDI', 'LIVINGAPARTMENTS_MODE', 'LIVINGAPARTMENTS_AVG', 'LIVINGAPARTMENTS_MEDI', 'FLOORSMIN_AVG', 'FLOORSMIN_MODE', 'FLOORSMIN_MEDI', 'YEARS_BUILD_MEDI', 'YEARS_BUILD_MODE', 'YEARS_BUILD_AVG', 'OWN_CAR_AGE', 'LANDAREA_MEDI', 'LANDAREA_MODE', 'LANDAREA_AVG', 'BASEMENTAREA_MEDI', 'BASEMENTAREA_AVG', 'BASEMENTAREA_MODE', 'EXT_SOURCE_1', 'NONLIVINGAREA_MODE', 'NONLIVINGAREA_AVG', 'NONLIVINGAREA_MEDI', 'ELEVATORS_MEDI', 'ELEVATORS_AVG', 'ELEVATORS_MODE', 'APARTMENTS_MEDI', 'APARTMENTS_AVG', 'APARTMENTS_MODE', 'ENTRANCES_MEDI', 'ENTRANCES_AVG', 'ENTRANCES_MODE', 'LIVINGAREA_AVG', 'LIVINGAREA_MODE', 'LIVINGAREA_MEDI', 'FLOORSMAX_MODE', 'FLOORSMAX_MEDI', 'FLOORSMAX_AVG', 'YEARS_BEGINEXPLUATATION_MODE', 'YEARS_BEGINEXPLUATATION_MEDI', 'YEARS_BEGINEXPLUATATION_AVG', 'TOTALAREA_MODE', 'EXT_SOURCE_3', 'AMT_REQ_CREDIT_BUREAU_HOUR', 'AMT_REQ_CREDIT_BUREAU_DAY', 'AMT_REQ_CREDIT_BUREAU_WEEK', 'AMT_REQ_CREDIT_BUREAU_MON', 'AMT_REQ_CREDIT_BUREAU_QRT', 'AMT_REQ_CREDIT_BUREAU_YEAR', 'OBS_30_CNT_SOCIAL_CIRCLE', 'DEF_30_CNT_SOCIAL_CIRCLE', 'OBS_60_CNT_SOCIAL_CIRCLE', 'DEF_60_CNT_SOCIAL_CIRCLE', 'EXT_SOURCE_2', 'AMT_GOODS_PRICE', 'AMT_ANNUITY', 'CNT_FAM_MEMBERS', 'DAYS_LAST_PHONE_CHANGE', 'AMT_CREDIT', 'AMT_INCOME_TOTAL', 'DAYS_REGISTRATION', 'REGION_POPULATION_RELATIVE']
Tratamiento de outliers¶
Los valores outlier se pueden sustituir por la media, mediana, valores extremos (media+3std o media-3std). Tras el siguiente análisis, he decidido como primera iteración dejarlos sin sustituir. Una vez llegue al modelo puedo realizar iteraciones utilizando diferentes métodos para comprobar si mejora el modelo
f_aux.get_deviation_of_mean_perc(df_application_train, list_var_continuous, target='TARGET', multiplier=3)
| 0.0 | 1.0 | variable | sum_outlier_values | porcentaje_sum_null_values | |
|---|---|---|---|---|---|
| 0 | 0.950626 | 0.049374 | COMMONAREA_MEDI | 1357 | 0.005516 |
| 1 | 0.952416 | 0.047584 | COMMONAREA_AVG | 1345 | 0.005467 |
| 2 | 0.947170 | 0.052830 | COMMONAREA_MODE | 1325 | 0.005386 |
| 3 | 0.921245 | 0.078755 | NONLIVINGAPARTMENTS_MODE | 546 | 0.002219 |
| 4 | 0.928082 | 0.071918 | NONLIVINGAPARTMENTS_AVG | 584 | 0.002374 |
| 5 | 0.929066 | 0.070934 | NONLIVINGAPARTMENTS_MEDI | 578 | 0.002350 |
| 6 | 0.948432 | 0.051568 | LIVINGAPARTMENTS_MODE | 1435 | 0.005833 |
| 7 | 0.952278 | 0.047722 | LIVINGAPARTMENTS_AVG | 1383 | 0.005622 |
| 8 | 0.950714 | 0.049286 | LIVINGAPARTMENTS_MEDI | 1400 | 0.005691 |
| 9 | 0.966527 | 0.033473 | FLOORSMIN_AVG | 478 | 0.001943 |
| 10 | 0.968831 | 0.031169 | FLOORSMIN_MODE | 385 | 0.001565 |
| 11 | 0.966667 | 0.033333 | FLOORSMIN_MEDI | 450 | 0.001829 |
| 12 | 0.930599 | 0.069401 | YEARS_BUILD_MEDI | 951 | 0.003866 |
| 13 | 0.929474 | 0.070526 | YEARS_BUILD_MODE | 950 | 0.003862 |
| 14 | 0.929787 | 0.070213 | YEARS_BUILD_AVG | 940 | 0.003821 |
| 15 | 0.917833 | 0.082167 | OWN_CAR_AGE | 2714 | 0.011032 |
| 16 | 0.941632 | 0.058368 | LANDAREA_MEDI | 1679 | 0.006825 |
| 17 | 0.941833 | 0.058167 | LANDAREA_MODE | 1702 | 0.006918 |
| 18 | 0.941319 | 0.058681 | LANDAREA_AVG | 1653 | 0.006719 |
| 19 | 0.946284 | 0.053716 | BASEMENTAREA_MEDI | 1601 | 0.006508 |
| 20 | 0.945741 | 0.054259 | BASEMENTAREA_AVG | 1585 | 0.006443 |
| 21 | 0.944276 | 0.055724 | BASEMENTAREA_MODE | 1651 | 0.006711 |
| 22 | 0.948809 | 0.051191 | NONLIVINGAREA_MODE | 1973 | 0.008020 |
| 23 | 0.948019 | 0.051981 | NONLIVINGAREA_AVG | 1943 | 0.007898 |
| 24 | 0.949048 | 0.050952 | NONLIVINGAREA_MEDI | 1943 | 0.007898 |
| 25 | 0.955062 | 0.044938 | ELEVATORS_MEDI | 1936 | 0.007870 |
| 26 | 0.955316 | 0.044684 | ELEVATORS_AVG | 1947 | 0.007914 |
| 27 | 0.952327 | 0.047673 | ELEVATORS_MODE | 2664 | 0.010829 |
| 28 | 0.951633 | 0.048367 | APARTMENTS_MEDI | 2419 | 0.009833 |
| 29 | 0.952501 | 0.047499 | APARTMENTS_AVG | 2379 | 0.009670 |
| 30 | 0.951626 | 0.048374 | APARTMENTS_MODE | 2398 | 0.009748 |
| 31 | 0.939684 | 0.060316 | ENTRANCES_MEDI | 1774 | 0.007211 |
| 32 | 0.940544 | 0.059456 | ENTRANCES_AVG | 1766 | 0.007179 |
| 33 | 0.943495 | 0.056505 | ENTRANCES_MODE | 2106 | 0.008561 |
| 34 | 0.950429 | 0.049571 | LIVINGAREA_AVG | 2562 | 0.010414 |
| 35 | 0.948900 | 0.051100 | LIVINGAREA_MODE | 2681 | 0.010898 |
| 36 | 0.951125 | 0.048875 | LIVINGAREA_MEDI | 2578 | 0.010479 |
| 37 | 0.960626 | 0.039374 | FLOORSMAX_MODE | 2108 | 0.008569 |
| 38 | 0.959799 | 0.040201 | FLOORSMAX_MEDI | 2189 | 0.008898 |
| 39 | 0.958373 | 0.041627 | FLOORSMAX_AVG | 2090 | 0.008496 |
| 40 | 0.903525 | 0.096475 | YEARS_BEGINEXPLUATATION_MODE | 539 | 0.002191 |
| 41 | 0.901923 | 0.098077 | YEARS_BEGINEXPLUATATION_MEDI | 520 | 0.002114 |
| 42 | 0.905109 | 0.094891 | YEARS_BEGINEXPLUATATION_AVG | 548 | 0.002228 |
| 43 | 0.956734 | 0.043266 | TOTALAREA_MODE | 2658 | 0.010805 |
| 44 | 0.922481 | 0.077519 | AMT_REQ_CREDIT_BUREAU_HOUR | 1290 | 0.005244 |
| 45 | 0.904318 | 0.095682 | AMT_REQ_CREDIT_BUREAU_DAY | 1181 | 0.004801 |
| 46 | 0.919511 | 0.080489 | AMT_REQ_CREDIT_BUREAU_WEEK | 6796 | 0.027625 |
| 47 | 0.946693 | 0.053307 | AMT_REQ_CREDIT_BUREAU_MON | 2570 | 0.010447 |
| 48 | 0.914917 | 0.085083 | AMT_REQ_CREDIT_BUREAU_QRT | 1857 | 0.007549 |
| 49 | 0.911144 | 0.088856 | AMT_REQ_CREDIT_BUREAU_YEAR | 2701 | 0.010979 |
| 50 | 0.914391 | 0.085609 | OBS_30_CNT_SOCIAL_CIRCLE | 4871 | 0.019800 |
| 51 | 0.879119 | 0.120881 | DEF_30_CNT_SOCIAL_CIRCLE | 5493 | 0.022329 |
| 52 | 0.913640 | 0.086360 | OBS_60_CNT_SOCIAL_CIRCLE | 4736 | 0.019251 |
| 53 | 0.872577 | 0.127423 | DEF_60_CNT_SOCIAL_CIRCLE | 3147 | 0.012792 |
| 54 | 0.961642 | 0.038358 | AMT_GOODS_PRICE | 3337 | 0.013565 |
| 55 | 0.965430 | 0.034570 | AMT_ANNUITY | 2372 | 0.009642 |
| 56 | 0.904997 | 0.095003 | CNT_FAM_MEMBERS | 3242 | 0.013178 |
| 57 | 0.955598 | 0.044402 | DAYS_LAST_PHONE_CHANGE | 518 | 0.002106 |
| 58 | 0.958188 | 0.041812 | AMT_CREDIT | 2583 | 0.010500 |
| 59 | 0.950249 | 0.049751 | AMT_INCOME_TOTAL | 201 | 0.000817 |
| 60 | 0.959016 | 0.040984 | DAYS_REGISTRATION | 610 | 0.002480 |
| 61 | 0.960159 | 0.039841 | REGION_POPULATION_RELATIVE | 6777 | 0.027548 |
Análisis de Outliers y Distribución en Variables Clases¶
Distribución entre Clases Variables como DEF_30_CNT_SOCIAL_CIRCLE y DEF_60_CNT_SOCIAL_CIRCLE muestran altas proporciones en la clase 1.0 (22.33% y 12.79%, respectivamente), lo que sugiere que estas variables son significativas para el análisis de riesgo crediticio. La alta presencia de valores en la clase 1.0 indica que los clientes con mayores valores en estas variables tienen una mayor probabilidad de incumplir con los pagos. Esto refuerza la necesidad de monitorear de cerca estos indicadores para mitigar el riesgo crediticio.
Valores Atípicos (Outliers) Variables como COMMONAREA_MEDI, COMMONAREA_AVG, y COMMONAREA_MODE presentan un número considerable de valores atípicos:
COMMONAREA_MEDI: 1357 valores atípicos (0.55% de los datos totales).
COMMONAREA_AVG: 1345 valores atípicos (0.55% de los datos totales).
COMMONAREA_MODE: 1325 valores atípicos (0.54% de los datos totales).
Otras variables con niveles significativos de outliers incluyen:
LIVINGAPARTMENTS_MODE: 1435 valores atípicos (0.58%).
YEARS_BUILD_MEDI: 951 valores atípicos (0.39%).
OWN_CAR_AGE: 2714 valores atípicos (1.10%).
Esta variabilidad sugiere la necesidad de aplicar transformaciones de datos para normalizar las distribuciones y mejorar la precisión de los modelos predictivos.
Porcentaje de Valores Nulos Algunas variables presentan un porcentaje significativo de valores nulos:
OWN_CAR_AGE: 1.1% de valores nulos.
AMT_REQ_CREDIT_BUREAU_HOUR: 0.52% de valores nulos.
OBS_30_CNT_SOCIAL_CIRCLE: 1.98% de valores nulos.
Es crucial manejar estos valores nulos mediante imputación o eliminación, dependiendo de la importancia de la variable en el análisis. Las técnicas de imputación pueden incluir la media, la mediana, o el uso de diversos algoritmos.
Variables Clave para el Riesgo Variables como OBS_30_CNT_SOCIAL_CIRCLE (19.8% en la clase 1.0) y AMT_REQ_CREDIT_BUREAU_YEAR (10.98%) son indicadores clave del comportamiento de pago. Estos predictores necesitan un manejo adecuado de los valores nulos y atípicos para garantizar su eficacia en los modelos de riesgo crediticio.
Correlaciones¶
f_aux.get_corr_matrix(dataset = df_application_train[list_var_continuous],
metodo='pearson', size_figure=[10,8])
plt.savefig('correlation_matrix.png', format='png')
plt.show()
<Figure size 640x480 with 0 Axes>
Análisis de la matriz de correlación¶
Analizando la matriz de correlación del conjunto de datos BAF, se observa un patrón significativo de correlaciones moderadas a fuertes (valores entre 0.4 y 0.8) entre las variables relacionadas con las características de los apartamentos y áreas comunes (COMMONAREA_MEDI, LIVINGAPARTMENTS_MODE, NONLIVINGAPARTMENTS_AVG). Esto sugiere una estructura coherente en la forma en que las propiedades están organizadas y documentadas en el sistema bancario, lo cual es relevante para la detección de patrones potencialmente fraudulentos. Asimismo, variables como COMMONAREA_MEDI y COMMONAREA_MODE, y YEARS_BUILD_MEDI y YEARS_BUILD_AVG, presentan altas correlaciones. Esta redundancia sugiere que pueden capturar información similar, lo cual es útil para simplificar el modelo eliminando o combinando estas variables, según el análisis .
Por otra parte, las variables relacionadas con información crediticia y financiera (AMT_REQ_CREDIT_BUREAU_HOUR, AMT_REQ_CREDIT_BUREAU_WEEK, OBS_30_CNT_SOCIAL_CIRCLE) muestran correlaciones débiles entre sí (valores cercanos a 0), lo que indica independencia en los diferentes aspectos del comportamiento financiero de los clientes. Esta independencia es particularmente valiosa para los modelos de detección de fraude, ya que permite capturar diferentes dimensiones del riesgo sin redundancia informativa.
corr = df_application_train[list_var_continuous].corr('pearson')
new_corr = corr.abs()
new_corr.loc[:,:] = np.tril(new_corr, k=-1) # below main lower triangle of an array
new_corr = new_corr.stack().to_frame('correlation').reset_index().sort_values(by='correlation', ascending=False)
new_corr[new_corr['correlation']>0.6]
| level_0 | level_1 | correlation | |
|---|---|---|---|
| 922 | YEARS_BUILD_AVG | YEARS_BUILD_MEDI | 0.998541 |
| 3562 | OBS_60_CNT_SOCIAL_CIRCLE | OBS_30_CNT_SOCIAL_CIRCLE | 0.998375 |
| 724 | FLOORSMIN_MEDI | FLOORSMIN_AVG | 0.997330 |
| 2639 | FLOORSMAX_AVG | FLOORSMAX_MEDI | 0.997097 |
| 2177 | ENTRANCES_AVG | ENTRANCES_MEDI | 0.996892 |
| 65 | COMMONAREA_AVG | COMMONAREA_MEDI | 0.996795 |
| 1781 | ELEVATORS_AVG | ELEVATORS_MEDI | 0.996114 |
| 2440 | LIVINGAREA_MEDI | LIVINGAREA_AVG | 0.995529 |
| 1979 | APARTMENTS_AVG | APARTMENTS_MEDI | 0.994567 |
| 2837 | YEARS_BEGINEXPLUATATION_AVG | YEARS_BEGINEXPLUATATION_MEDI | 0.993656 |
| 527 | LIVINGAPARTMENTS_MEDI | LIVINGAPARTMENTS_AVG | 0.993497 |
| 1319 | BASEMENTAREA_AVG | BASEMENTAREA_MEDI | 0.993394 |
| 329 | NONLIVINGAPARTMENTS_MEDI | NONLIVINGAPARTMENTS_AVG | 0.993332 |
| 1186 | LANDAREA_AVG | LANDAREA_MEDI | 0.991841 |
| 1649 | NONLIVINGAREA_MEDI | NONLIVINGAREA_AVG | 0.990919 |
| 923 | YEARS_BUILD_AVG | YEARS_BUILD_MODE | 0.989274 |
| 857 | YEARS_BUILD_MODE | YEARS_BUILD_MEDI | 0.989215 |
| 725 | FLOORSMIN_MEDI | FLOORSMIN_MODE | 0.988394 |
| 2573 | FLOORSMAX_MEDI | FLOORSMAX_MODE | 0.987911 |
| 4022 | AMT_CREDIT | AMT_GOODS_PRICE | 0.986973 |
| 659 | FLOORSMIN_MODE | FLOORSMIN_AVG | 0.985892 |
| 2638 | FLOORSMAX_AVG | FLOORSMAX_MODE | 0.985447 |
| 1846 | ELEVATORS_MODE | ELEVATORS_MEDI | 0.982740 |
| 1121 | LANDAREA_MODE | LANDAREA_MEDI | 0.981076 |
| 2242 | ENTRANCES_MODE | ENTRANCES_MEDI | 0.980548 |
| 130 | COMMONAREA_MODE | COMMONAREA_MEDI | 0.980419 |
| 131 | COMMONAREA_MODE | COMMONAREA_AVG | 0.978819 |
| 1847 | ELEVATORS_MODE | ELEVATORS_AVG | 0.978718 |
| 1384 | BASEMENTAREA_MODE | BASEMENTAREA_MEDI | 0.977995 |
| 328 | NONLIVINGAPARTMENTS_MEDI | NONLIVINGAPARTMENTS_MODE | 0.977673 |
| 2243 | ENTRANCES_MODE | ENTRANCES_AVG | 0.977673 |
| 2044 | APARTMENTS_MODE | APARTMENTS_MEDI | 0.977121 |
| 1648 | NONLIVINGAREA_MEDI | NONLIVINGAREA_MODE | 0.974850 |
| 1187 | LANDAREA_AVG | LANDAREA_MODE | 0.974636 |
| 526 | LIVINGAPARTMENTS_MEDI | LIVINGAPARTMENTS_MODE | 0.974272 |
| 2441 | LIVINGAREA_MEDI | LIVINGAREA_MODE | 0.974267 |
| 1385 | BASEMENTAREA_MODE | BASEMENTAREA_AVG | 0.972668 |
| 2045 | APARTMENTS_MODE | APARTMENTS_AVG | 0.972521 |
| 2836 | YEARS_BEGINEXPLUATATION_AVG | YEARS_BEGINEXPLUATATION_MODE | 0.972250 |
| 2375 | LIVINGAREA_MODE | LIVINGAREA_AVG | 0.971586 |
| 263 | NONLIVINGAPARTMENTS_AVG | NONLIVINGAPARTMENTS_MODE | 0.971156 |
| 461 | LIVINGAPARTMENTS_AVG | LIVINGAPARTMENTS_MODE | 0.968290 |
| 1583 | NONLIVINGAREA_AVG | NONLIVINGAREA_MODE | 0.965607 |
| 2771 | YEARS_BEGINEXPLUATATION_MEDI | YEARS_BEGINEXPLUATATION_MODE | 0.964416 |
| 1957 | APARTMENTS_AVG | LIVINGAPARTMENTS_AVG | 0.941907 |
| 1893 | APARTMENTS_MEDI | LIVINGAPARTMENTS_MEDI | 0.939974 |
| 1958 | APARTMENTS_AVG | LIVINGAPARTMENTS_MEDI | 0.939133 |
| 2021 | APARTMENTS_MODE | LIVINGAPARTMENTS_MODE | 0.936395 |
| 1892 | APARTMENTS_MEDI | LIVINGAPARTMENTS_AVG | 0.932748 |
| 1891 | APARTMENTS_MEDI | LIVINGAPARTMENTS_MODE | 0.930923 |
| 1956 | APARTMENTS_AVG | LIVINGAPARTMENTS_MODE | 0.928522 |
| 2895 | TOTALAREA_MODE | LIVINGAREA_AVG | 0.923938 |
| 2897 | TOTALAREA_MODE | LIVINGAREA_MEDI | 0.918448 |
| 2434 | LIVINGAREA_MEDI | APARTMENTS_MEDI | 0.916163 |
| 2305 | LIVINGAREA_AVG | APARTMENTS_AVG | 0.913431 |
| 2304 | LIVINGAREA_AVG | APARTMENTS_MEDI | 0.912751 |
| 2023 | APARTMENTS_MODE | LIVINGAPARTMENTS_MEDI | 0.912120 |
| 2435 | LIVINGAREA_MEDI | APARTMENTS_AVG | 0.912055 |
| 2371 | LIVINGAREA_MODE | APARTMENTS_MODE | 0.910854 |
| 2022 | APARTMENTS_MODE | LIVINGAPARTMENTS_AVG | 0.905281 |
| 2896 | TOTALAREA_MODE | LIVINGAREA_MODE | 0.898201 |
| 2369 | LIVINGAREA_MODE | APARTMENTS_MEDI | 0.896154 |
| 2436 | LIVINGAREA_MEDI | APARTMENTS_MODE | 0.894534 |
| 2370 | LIVINGAREA_MODE | APARTMENTS_AVG | 0.892935 |
| 2890 | TOTALAREA_MODE | APARTMENTS_AVG | 0.891761 |
| 2306 | LIVINGAREA_AVG | APARTMENTS_MODE | 0.891096 |
| 2889 | TOTALAREA_MODE | APARTMENTS_MEDI | 0.886290 |
| 2413 | LIVINGAREA_MEDI | LIVINGAPARTMENTS_MEDI | 0.881342 |
| 2283 | LIVINGAREA_AVG | LIVINGAPARTMENTS_MEDI | 0.879898 |
| 2282 | LIVINGAREA_AVG | LIVINGAPARTMENTS_AVG | 0.877002 |
| 2346 | LIVINGAREA_MODE | LIVINGAPARTMENTS_MODE | 0.876562 |
| 2412 | LIVINGAREA_MEDI | LIVINGAPARTMENTS_AVG | 0.874502 |
| 2411 | LIVINGAREA_MEDI | LIVINGAPARTMENTS_MODE | 0.872826 |
| 2281 | LIVINGAREA_AVG | LIVINGAPARTMENTS_MODE | 0.871391 |
| 2431 | LIVINGAREA_MEDI | ELEVATORS_MEDI | 0.867304 |
| 2302 | LIVINGAREA_AVG | ELEVATORS_AVG | 0.866936 |
| 2301 | LIVINGAREA_AVG | ELEVATORS_MEDI | 0.864935 |
| 2432 | LIVINGAREA_MEDI | ELEVATORS_AVG | 0.864576 |
| 2891 | TOTALAREA_MODE | APARTMENTS_MODE | 0.863831 |
| 3628 | DEF_60_CNT_SOCIAL_CIRCLE | DEF_30_CNT_SOCIAL_CIRCLE | 0.858585 |
| 2368 | LIVINGAREA_MODE | ELEVATORS_MODE | 0.855085 |
| 2433 | LIVINGAREA_MEDI | ELEVATORS_MODE | 0.854719 |
| 2348 | LIVINGAREA_MODE | LIVINGAPARTMENTS_MEDI | 0.853603 |
| 2303 | LIVINGAREA_AVG | ELEVATORS_MODE | 0.851599 |
| 2347 | LIVINGAREA_MODE | LIVINGAPARTMENTS_AVG | 0.847424 |
| 2887 | TOTALAREA_MODE | ELEVATORS_AVG | 0.844045 |
| 2867 | TOTALAREA_MODE | LIVINGAPARTMENTS_AVG | 0.843934 |
| 2868 | TOTALAREA_MODE | LIVINGAPARTMENTS_MEDI | 0.842581 |
| 2366 | LIVINGAREA_MODE | ELEVATORS_MEDI | 0.839940 |
| 1911 | APARTMENTS_MEDI | ELEVATORS_MEDI | 0.837902 |
| 2367 | LIVINGAREA_MODE | ELEVATORS_AVG | 0.837747 |
| 2886 | TOTALAREA_MODE | ELEVATORS_MEDI | 0.837582 |
| 1977 | APARTMENTS_AVG | ELEVATORS_AVG | 0.837210 |
| 1976 | APARTMENTS_AVG | ELEVATORS_MEDI | 0.835271 |
| 1912 | APARTMENTS_MEDI | ELEVATORS_AVG | 0.835070 |
| 2866 | TOTALAREA_MODE | LIVINGAPARTMENTS_MODE | 0.831438 |
| 2043 | APARTMENTS_MODE | ELEVATORS_MODE | 0.827136 |
| 1913 | APARTMENTS_MEDI | ELEVATORS_MODE | 0.826041 |
| 1978 | APARTMENTS_AVG | ELEVATORS_MODE | 0.822539 |
| 2888 | TOTALAREA_MODE | ELEVATORS_MODE | 0.820294 |
| 1698 | ELEVATORS_MEDI | LIVINGAPARTMENTS_MEDI | 0.812928 |
| 1763 | ELEVATORS_AVG | LIVINGAPARTMENTS_MEDI | 0.811431 |
| 1762 | ELEVATORS_AVG | LIVINGAPARTMENTS_AVG | 0.810191 |
| 2041 | APARTMENTS_MODE | ELEVATORS_MEDI | 0.809595 |
| 1826 | ELEVATORS_MODE | LIVINGAPARTMENTS_MODE | 0.807788 |
| 1697 | ELEVATORS_MEDI | LIVINGAPARTMENTS_AVG | 0.807709 |
| 2042 | APARTMENTS_MODE | ELEVATORS_AVG | 0.806702 |
| 1696 | ELEVATORS_MEDI | LIVINGAPARTMENTS_MODE | 0.799072 |
| 1828 | ELEVATORS_MODE | LIVINGAPARTMENTS_MEDI | 0.797843 |
| 1761 | ELEVATORS_AVG | LIVINGAPARTMENTS_MODE | 0.797293 |
| 1827 | ELEVATORS_MODE | LIVINGAPARTMENTS_AVG | 0.792087 |
| 3827 | AMT_ANNUITY | AMT_GOODS_PRICE | 0.775607 |
| 4023 | AMT_CREDIT | AMT_ANNUITY | 0.770909 |
| 2609 | FLOORSMAX_AVG | FLOORSMIN_AVG | 0.742606 |
| 2546 | FLOORSMAX_MEDI | FLOORSMIN_MEDI | 0.740330 |
| 2544 | FLOORSMAX_MEDI | FLOORSMIN_AVG | 0.739968 |
| 2611 | FLOORSMAX_AVG | FLOORSMIN_MEDI | 0.739934 |
| 2481 | FLOORSMAX_MODE | FLOORSMIN_MEDI | 0.729638 |
| 2479 | FLOORSMAX_MODE | FLOORSMIN_AVG | 0.728972 |
| 2480 | FLOORSMAX_MODE | FLOORSMIN_MODE | 0.726967 |
| 2545 | FLOORSMAX_MEDI | FLOORSMIN_MODE | 0.723297 |
| 2610 | FLOORSMAX_AVG | FLOORSMIN_MODE | 0.722565 |
| 2294 | LIVINGAREA_AVG | BASEMENTAREA_MEDI | 0.692146 |
| 2295 | LIVINGAREA_AVG | BASEMENTAREA_AVG | 0.692008 |
| 2424 | LIVINGAREA_MEDI | BASEMENTAREA_MEDI | 0.691154 |
| 2361 | LIVINGAREA_MODE | BASEMENTAREA_MODE | 0.689359 |
| 2425 | LIVINGAREA_MEDI | BASEMENTAREA_AVG | 0.688709 |
| 2627 | FLOORSMAX_AVG | ELEVATORS_AVG | 0.682034 |
| 1904 | APARTMENTS_MEDI | BASEMENTAREA_MEDI | 0.681576 |
| 2359 | LIVINGAREA_MODE | BASEMENTAREA_MEDI | 0.680290 |
| 2562 | FLOORSMAX_MEDI | ELEVATORS_AVG | 0.679692 |
| 1970 | APARTMENTS_AVG | BASEMENTAREA_AVG | 0.679499 |
| 1969 | APARTMENTS_AVG | BASEMENTAREA_MEDI | 0.679434 |
| 1905 | APARTMENTS_MEDI | BASEMENTAREA_AVG | 0.678934 |
| 2036 | APARTMENTS_MODE | BASEMENTAREA_MODE | 0.678883 |
| 2626 | FLOORSMAX_AVG | ELEVATORS_MEDI | 0.678061 |
| 2561 | FLOORSMAX_MEDI | ELEVATORS_MEDI | 0.677529 |
| 2360 | LIVINGAREA_MODE | BASEMENTAREA_AVG | 0.676242 |
| 2497 | FLOORSMAX_MODE | ELEVATORS_AVG | 0.672738 |
| 2296 | LIVINGAREA_AVG | BASEMENTAREA_MODE | 0.672313 |
| 2880 | TOTALAREA_MODE | BASEMENTAREA_AVG | 0.672107 |
| 2426 | LIVINGAREA_MEDI | BASEMENTAREA_MODE | 0.671869 |
| 2496 | FLOORSMAX_MODE | ELEVATORS_MEDI | 0.670744 |
| 2034 | APARTMENTS_MODE | BASEMENTAREA_MEDI | 0.670177 |
| 2879 | TOTALAREA_MODE | BASEMENTAREA_MEDI | 0.669521 |
| 2035 | APARTMENTS_MODE | BASEMENTAREA_AVG | 0.666916 |
| 1906 | APARTMENTS_MEDI | BASEMENTAREA_MODE | 0.663709 |
| 2498 | FLOORSMAX_MODE | ELEVATORS_MODE | 0.662805 |
| 1971 | APARTMENTS_AVG | BASEMENTAREA_MODE | 0.660472 |
| 2628 | FLOORSMAX_AVG | ELEVATORS_MODE | 0.657906 |
| 2563 | FLOORSMAX_MEDI | ELEVATORS_MODE | 0.657274 |
| 2231 | ENTRANCES_MODE | BASEMENTAREA_MODE | 0.656749 |
| 2166 | ENTRANCES_AVG | BASEMENTAREA_MODE | 0.656123 |
| 2164 | ENTRANCES_AVG | BASEMENTAREA_MEDI | 0.655797 |
| 2101 | ENTRANCES_MEDI | BASEMENTAREA_MODE | 0.655316 |
| 1371 | BASEMENTAREA_MODE | LIVINGAPARTMENTS_MODE | 0.654539 |
| 2099 | ENTRANCES_MEDI | BASEMENTAREA_MEDI | 0.654480 |
| 1241 | BASEMENTAREA_MEDI | LIVINGAPARTMENTS_MODE | 0.653390 |
| 2165 | ENTRANCES_AVG | BASEMENTAREA_AVG | 0.653363 |
| 1243 | BASEMENTAREA_MEDI | LIVINGAPARTMENTS_MEDI | 0.652090 |
| 2100 | ENTRANCES_MEDI | BASEMENTAREA_AVG | 0.649411 |
| 1308 | BASEMENTAREA_AVG | LIVINGAPARTMENTS_MEDI | 0.648910 |
| 2881 | TOTALAREA_MODE | BASEMENTAREA_MODE | 0.648268 |
| 1306 | BASEMENTAREA_AVG | LIVINGAPARTMENTS_MODE | 0.648179 |
| 1242 | BASEMENTAREA_MEDI | LIVINGAPARTMENTS_AVG | 0.646934 |
| 1307 | BASEMENTAREA_AVG | LIVINGAPARTMENTS_AVG | 0.646320 |
| 2900 | TOTALAREA_MODE | FLOORSMAX_AVG | 0.634444 |
| 2229 | ENTRANCES_MODE | BASEMENTAREA_MEDI | 0.633730 |
| 2899 | TOTALAREA_MODE | FLOORSMAX_MEDI | 0.631766 |
| 2635 | FLOORSMAX_AVG | LIVINGAREA_AVG | 0.631640 |
| 2570 | FLOORSMAX_MEDI | LIVINGAREA_AVG | 0.629500 |
| 1373 | BASEMENTAREA_MODE | LIVINGAPARTMENTS_MEDI | 0.628567 |
| 2230 | ENTRANCES_MODE | BASEMENTAREA_AVG | 0.628242 |
| 2637 | FLOORSMAX_AVG | LIVINGAREA_MEDI | 0.628135 |
| 2572 | FLOORSMAX_MEDI | LIVINGAREA_MEDI | 0.627292 |
| 2898 | TOTALAREA_MODE | FLOORSMAX_MODE | 0.627108 |
| 2505 | FLOORSMAX_MODE | LIVINGAREA_AVG | 0.626861 |
| 2507 | FLOORSMAX_MODE | LIVINGAREA_MEDI | 0.624993 |
| 1372 | BASEMENTAREA_MODE | LIVINGAPARTMENTS_AVG | 0.623224 |
| 2373 | LIVINGAREA_MODE | ENTRANCES_AVG | 0.621636 |
| 2374 | LIVINGAREA_MODE | ENTRANCES_MODE | 0.621611 |
| 2372 | LIVINGAREA_MODE | ENTRANCES_MEDI | 0.620966 |
| 2630 | FLOORSMAX_AVG | APARTMENTS_AVG | 0.619744 |
| 2438 | LIVINGAREA_MEDI | ENTRANCES_AVG | 0.618093 |
| 2308 | LIVINGAREA_AVG | ENTRANCES_AVG | 0.617722 |
| 2437 | LIVINGAREA_MEDI | ENTRANCES_MEDI | 0.617581 |
| 2565 | FLOORSMAX_MEDI | APARTMENTS_AVG | 0.617518 |
| 2629 | FLOORSMAX_AVG | APARTMENTS_MEDI | 0.616272 |
| 2564 | FLOORSMAX_MEDI | APARTMENTS_MEDI | 0.615321 |
| 2500 | FLOORSMAX_MODE | APARTMENTS_AVG | 0.615296 |
| 2241 | ENTRANCES_MODE | APARTMENTS_MODE | 0.615235 |
| 2307 | LIVINGAREA_AVG | ENTRANCES_MEDI | 0.613822 |
| 2499 | FLOORSMAX_MODE | APARTMENTS_MEDI | 0.613427 |
| 2111 | ENTRANCES_MEDI | APARTMENTS_MODE | 0.612070 |
| 2176 | ENTRANCES_AVG | APARTMENTS_MODE | 0.611982 |
| 2174 | ENTRANCES_AVG | APARTMENTS_MEDI | 0.611266 |
| 2109 | ENTRANCES_MEDI | APARTMENTS_MEDI | 0.610921 |
| 2175 | ENTRANCES_AVG | APARTMENTS_AVG | 0.610528 |
| 2506 | FLOORSMAX_MODE | LIVINGAREA_MODE | 0.607184 |
| 2110 | ENTRANCES_MEDI | APARTMENTS_AVG | 0.606728 |
Variables con correlación extremadamente alta (> 0.99):¶
OBS_60_CNT_SOCIAL_CIRCLE y OBS_30_CNT_SOCIAL_CIRCLE (0.9985): Estas dos variables probablemente representan conteos de observaciones sociales en diferentes intervalos de tiempo (60 y 30 días), lo cual indica una relación cercana ya que están midiendo algo muy similar. Podría ser redundante conservar ambas variables, y se podría eliminar una para reducir la multicolinealidad. Otros ejemplos con correlaciones cercanas a 1 incluyen pares como YEARS_BUILD_AVG y YEARS_BUILD_MEDI (0.9984), y FLOORSMIN_MEDI y FLOORSMIN_AVG (0.9972), que también sugieren duplicidad en la información.
Variables de medidas promedio y mediana (AVG y MEDI):¶
Las variables con sufijos AVG, MEDI y MODE (promedio, mediana y moda) de características similares como FLOORSMAX, LIVINGAREA, APARTMENTS, ELEVATORS, etc., tienden a tener una alta correlación entre sí. A partir de esto, se puede analizar que, en muchos casos, la media, mediana y moda de estas características tienden a ser valores cercanos. Por ejemplo, ENTRANCES_AVG y ENTRANCES_MEDI tienen una correlación de 0.9969. En estos casos, se podría optar por seleccionar solo una de estas variables representativas (como AVG o MEDI) para reducir la redundancia sin perder información significativa.
Relación entre área y otras variables estructurales:¶
LIVINGAREA, BASEMENTAREA, y APARTMENTS están muy correlacionadas entre sí. Por ejemplo, LIVINGAREA_MEDI y APARTMENTS_MEDI tienen una correlación de 0.9163. Esto sugiere que los tamaños de áreas habitables y apartamentos suelen estar alineados. La alta correlación entre estas áreas y otras variables estructurales puede indicar que las características de tamaño y espacio tienen un comportamiento consistente en los registros, algo que es útil para el análisis de propiedades o evaluaciones.
Total Area vs. Componentes individuales:¶
TOTALAREA_MODE está altamente correlacionado con otras áreas específicas como LIVINGAREA y APARTMENTS, indicando que el área total tiende a ser una combinación directa de estas variables. Por ejemplo, TOTALAREA_MODE y LIVINGAREA_AVG tienen una correlación de 0.9251. Es probable que TOTALAREA_MODE esté estrechamente relacionada con las áreas individuales, por lo que es necesario hacer un estudio para determinar el valor de cada una de estas áreas en el presente análisis.
Posible problema de multicolinealidad:¶
La alta correlación entre estas variables genera un problema conocido como multicolinealidad. Esto significa que las variables están tan estrechamente relacionadas que es difícil determinar el efecto único de cada una sobre la variable dependiente en un modelo de regresión. Para resolver este problema, se pueden aplicar técnicas como el Análisis de Componentes Principales (PCA) o eliminar algunas de las variables altamente correlacionadas.
Por último, decidimos en esta primera iteración, no eliminar correlaciones. Sin embargo, si al final se aplica algún algoritmo que lo requiera, se eliminaran las correlaciones correspondientes.
Tratamiento de Valores Nulos¶
En este apartado se van a considerar las siguientes preguntas ¿Son todos los nulos de una clase de la variable objetivo? o ¿Tienen el mismo porcentaje de la variable objetivo?
list_var_continuous
['COMMONAREA_MEDI', 'COMMONAREA_AVG', 'COMMONAREA_MODE', 'NONLIVINGAPARTMENTS_MODE', 'NONLIVINGAPARTMENTS_AVG', 'NONLIVINGAPARTMENTS_MEDI', 'LIVINGAPARTMENTS_MODE', 'LIVINGAPARTMENTS_AVG', 'LIVINGAPARTMENTS_MEDI', 'FLOORSMIN_AVG', 'FLOORSMIN_MODE', 'FLOORSMIN_MEDI', 'YEARS_BUILD_MEDI', 'YEARS_BUILD_MODE', 'YEARS_BUILD_AVG', 'OWN_CAR_AGE', 'LANDAREA_MEDI', 'LANDAREA_MODE', 'LANDAREA_AVG', 'BASEMENTAREA_MEDI', 'BASEMENTAREA_AVG', 'BASEMENTAREA_MODE', 'EXT_SOURCE_1', 'NONLIVINGAREA_MODE', 'NONLIVINGAREA_AVG', 'NONLIVINGAREA_MEDI', 'ELEVATORS_MEDI', 'ELEVATORS_AVG', 'ELEVATORS_MODE', 'APARTMENTS_MEDI', 'APARTMENTS_AVG', 'APARTMENTS_MODE', 'ENTRANCES_MEDI', 'ENTRANCES_AVG', 'ENTRANCES_MODE', 'LIVINGAREA_AVG', 'LIVINGAREA_MODE', 'LIVINGAREA_MEDI', 'FLOORSMAX_MODE', 'FLOORSMAX_MEDI', 'FLOORSMAX_AVG', 'YEARS_BEGINEXPLUATATION_MODE', 'YEARS_BEGINEXPLUATATION_MEDI', 'YEARS_BEGINEXPLUATATION_AVG', 'TOTALAREA_MODE', 'EXT_SOURCE_3', 'AMT_REQ_CREDIT_BUREAU_HOUR', 'AMT_REQ_CREDIT_BUREAU_DAY', 'AMT_REQ_CREDIT_BUREAU_WEEK', 'AMT_REQ_CREDIT_BUREAU_MON', 'AMT_REQ_CREDIT_BUREAU_QRT', 'AMT_REQ_CREDIT_BUREAU_YEAR', 'OBS_30_CNT_SOCIAL_CIRCLE', 'DEF_30_CNT_SOCIAL_CIRCLE', 'OBS_60_CNT_SOCIAL_CIRCLE', 'DEF_60_CNT_SOCIAL_CIRCLE', 'EXT_SOURCE_2', 'AMT_GOODS_PRICE', 'AMT_ANNUITY', 'CNT_FAM_MEMBERS', 'DAYS_LAST_PHONE_CHANGE', 'AMT_CREDIT', 'AMT_INCOME_TOTAL', 'DAYS_REGISTRATION', 'REGION_POPULATION_RELATIVE']
f_aux.get_percent_null_values_target(df_application_train, list_var_continuous, target='TARGET')
| 0.0 | 1.0 | variable | sum_null_values | porcentaje_sum_null_values | |
|---|---|---|---|---|---|
| 0 | 0.914264 | 0.085736 | COMMONAREA_MEDI | 171807 | 0.698380 |
| 1 | 0.914264 | 0.085736 | COMMONAREA_AVG | 171807 | 0.698380 |
| 2 | 0.914264 | 0.085736 | COMMONAREA_MODE | 171807 | 0.698380 |
| 3 | 0.914240 | 0.085760 | NONLIVINGAPARTMENTS_MODE | 170790 | 0.694246 |
| 4 | 0.914240 | 0.085760 | NONLIVINGAPARTMENTS_AVG | 170790 | 0.694246 |
| 5 | 0.914240 | 0.085760 | NONLIVINGAPARTMENTS_MEDI | 170790 | 0.694246 |
| 6 | 0.913842 | 0.086158 | LIVINGAPARTMENTS_MODE | 168087 | 0.683258 |
| 7 | 0.913842 | 0.086158 | LIVINGAPARTMENTS_AVG | 168087 | 0.683258 |
| 8 | 0.913842 | 0.086158 | LIVINGAPARTMENTS_MEDI | 168087 | 0.683258 |
| 9 | 0.913712 | 0.086288 | FLOORSMIN_AVG | 166825 | 0.678128 |
| 10 | 0.913712 | 0.086288 | FLOORSMIN_MODE | 166825 | 0.678128 |
| 11 | 0.913712 | 0.086288 | FLOORSMIN_MEDI | 166825 | 0.678128 |
| 12 | 0.913235 | 0.086765 | YEARS_BUILD_MEDI | 163534 | 0.664751 |
| 13 | 0.913235 | 0.086765 | YEARS_BUILD_MODE | 163534 | 0.664751 |
| 14 | 0.913235 | 0.086765 | YEARS_BUILD_AVG | 163534 | 0.664751 |
| 15 | 0.915097 | 0.084903 | OWN_CAR_AGE | 162385 | 0.660080 |
| 16 | 0.911722 | 0.088278 | LANDAREA_MEDI | 145926 | 0.593176 |
| 17 | 0.911722 | 0.088278 | LANDAREA_MODE | 145926 | 0.593176 |
| 18 | 0.911722 | 0.088278 | LANDAREA_AVG | 145926 | 0.593176 |
| 19 | 0.910908 | 0.089092 | BASEMENTAREA_MEDI | 143829 | 0.584652 |
| 20 | 0.910908 | 0.089092 | BASEMENTAREA_AVG | 143829 | 0.584652 |
| 21 | 0.910908 | 0.089092 | BASEMENTAREA_MODE | 143829 | 0.584652 |
| 22 | 0.914865 | 0.085135 | EXT_SOURCE_1 | 138768 | 0.564079 |
| 23 | 0.909521 | 0.090479 | NONLIVINGAREA_MODE | 135623 | 0.551295 |
| 24 | 0.909521 | 0.090479 | NONLIVINGAREA_AVG | 135623 | 0.551295 |
| 25 | 0.909521 | 0.090479 | NONLIVINGAREA_MEDI | 135623 | 0.551295 |
| 26 | 0.908877 | 0.091123 | ELEVATORS_MEDI | 130988 | 0.532454 |
| 27 | 0.908877 | 0.091123 | ELEVATORS_AVG | 130988 | 0.532454 |
| 28 | 0.908877 | 0.091123 | ELEVATORS_MODE | 130988 | 0.532454 |
| 29 | 0.908361 | 0.091639 | APARTMENTS_MEDI | 124761 | 0.507142 |
| 30 | 0.908361 | 0.091639 | APARTMENTS_AVG | 124761 | 0.507142 |
| 31 | 0.908361 | 0.091639 | APARTMENTS_MODE | 124761 | 0.507142 |
| 32 | 0.908027 | 0.091973 | ENTRANCES_MEDI | 123732 | 0.502959 |
| 33 | 0.908027 | 0.091973 | ENTRANCES_AVG | 123732 | 0.502959 |
| 34 | 0.908027 | 0.091973 | ENTRANCES_MODE | 123732 | 0.502959 |
| 35 | 0.908345 | 0.091655 | LIVINGAREA_AVG | 123365 | 0.501467 |
| 36 | 0.908345 | 0.091655 | LIVINGAREA_MODE | 123365 | 0.501467 |
| 37 | 0.908345 | 0.091655 | LIVINGAREA_MEDI | 123365 | 0.501467 |
| 38 | 0.907842 | 0.092158 | FLOORSMAX_MODE | 122323 | 0.497232 |
| 39 | 0.907842 | 0.092158 | FLOORSMAX_MEDI | 122323 | 0.497232 |
| 40 | 0.907842 | 0.092158 | FLOORSMAX_AVG | 122323 | 0.497232 |
| 41 | 0.907669 | 0.092331 | YEARS_BEGINEXPLUATATION_MODE | 119906 | 0.487407 |
| 42 | 0.907669 | 0.092331 | YEARS_BEGINEXPLUATATION_MEDI | 119906 | 0.487407 |
| 43 | 0.907669 | 0.092331 | YEARS_BEGINEXPLUATATION_AVG | 119906 | 0.487407 |
| 44 | 0.907355 | 0.092645 | TOTALAREA_MODE | 118657 | 0.482330 |
| 45 | 0.906818 | 0.093182 | EXT_SOURCE_3 | 48722 | 0.198050 |
| 46 | 0.897002 | 0.102998 | AMT_REQ_CREDIT_BUREAU_HOUR | 33156 | 0.134776 |
| 47 | 0.897002 | 0.102998 | AMT_REQ_CREDIT_BUREAU_DAY | 33156 | 0.134776 |
| 48 | 0.897002 | 0.102998 | AMT_REQ_CREDIT_BUREAU_WEEK | 33156 | 0.134776 |
| 49 | 0.897002 | 0.102998 | AMT_REQ_CREDIT_BUREAU_MON | 33156 | 0.134776 |
| 50 | 0.897002 | 0.102998 | AMT_REQ_CREDIT_BUREAU_QRT | 33156 | 0.134776 |
| 51 | 0.897002 | 0.102998 | AMT_REQ_CREDIT_BUREAU_YEAR | 33156 | 0.134776 |
| 52 | 0.960859 | 0.039141 | OBS_30_CNT_SOCIAL_CIRCLE | 792 | 0.003219 |
| 53 | 0.960859 | 0.039141 | DEF_30_CNT_SOCIAL_CIRCLE | 792 | 0.003219 |
| 54 | 0.960859 | 0.039141 | OBS_60_CNT_SOCIAL_CIRCLE | 792 | 0.003219 |
| 55 | 0.960859 | 0.039141 | DEF_60_CNT_SOCIAL_CIRCLE | 792 | 0.003219 |
| 56 | 0.911591 | 0.088409 | EXT_SOURCE_2 | 509 | 0.002069 |
| 57 | 0.927350 | 0.072650 | AMT_GOODS_PRICE | 234 | 0.000951 |
| 58 | 1.000000 | 0.000000 | AMT_ANNUITY | 9 | 0.000037 |
| 59 | 1.000000 | 0.000000 | CNT_FAM_MEMBERS | 2 | 0.000008 |
| 60 | 1.000000 | 0.000000 | DAYS_LAST_PHONE_CHANGE | 1 | 0.000004 |
Técnicas para tratamiento de valores nulos¶
Cuando se enfrenta a la presencia de valores nulos en un conjunto de datos y no se tiene mucho contexto sobre las variables, se pueden considerar diferentes técnicas para manejarlos. A continuación se presentan varias opciones y sus explicaciones:
Opción 0:¶
Algoritmos que Aceptan Valores Nulos: Algunos algoritmos de machine learning pueden manejar de manera directa los valores nulos en su entrada. Esto significa que no es necesario realizar ninguna imputación o eliminación de datos nulos, ya que el algoritmo cuenta con mecanismos internos para tratar con la ausencia de valores.
Opción 1:¶
Eliminar Filas con Valores Nulos: Se puede optar por eliminar todas las filas que contienen valores nulos. Esta estrategia es simple y garantiza que solo se utilicen datos completos en el modelo. Sin embargo, no es óptima en conjuntos de datos donde muchas filas tienen valores nulos, ya que podría resultar en la pérdida de una cantidad significativa de información.
Opción 2:¶
Imputación de Valores Nulos: Otra opción es imputar los valores nulos utilizando diversas técnicas:
- media
- mediana
- máximo
- mínimo
- valores extremose
Decidimos rellenar todas las columnas continuas menos revol_util por el valor -99. De esta manera, se diferencian los outlier del resto de la muestra poninendo un valor muy separado del resto de la variable. Se puede explorar el resultado del modelo utilizando diferentes métodos.
Justificación¶
Rellenar las columnas continuas con un valor como -99 puede ser una estrategia efectiva para tratar los valores nulos, especialmente si se desea diferenciar claramente estos valores de los datos válidos. Aquí están algunas justificaciones y consideraciones para esta técnica:
Diferenciación Clara de Valores Nulos: Al usar un valor extremo como -99, se asegura que los valores nulos sean claramente distinguibles del resto de los datos. Esto es particularmente útil en el preprocesamiento y en la fase de modelado, ya que los modelos pueden identificar fácilmente estos valores como especiales.
Mantener la Completa Información del Conjunto de Datos: Esta técnica permite mantener todas las filas en el conjunto de datos, evitando la pérdida de información que podría ocurrir si se eliminan filas con valores nulos. Esto es crucial cuando se tiene un conjunto de datos limitado o cuando los valores nulos están distribuidos de manera significativa en el dataset.
Flexibilidad para Modelos de Machine Learning: Muchos algoritmos de machine learning pueden manejar valores extremos de manera eficiente y, en algunos casos, pueden interpretar estos valores como indicadores adicionales. Esto puede ayudar a los modelos a aprender patrones adicionales sobre los datos.
Simplificación del Preprocesamiento: Imputar todos los valores continuos nulos con un valor constante como -99 simplifica el proceso de preprocesamiento, haciéndolo más rápido y menos propenso a errores.mos
# Verificar valores nulos y su proporción
null_summary = df_application_train[list_var_continuous].isnull().mean().sort_values(ascending=False)
print(null_summary)
# Visualizar la distribución de los valores nulos
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 8))
sns.heatmap(df_application_train[list_var_continuous].isnull(), cbar=False, cmap='viridis')
plt.title('Mapa de Calor de Valores Nulos en Variables Continuas')
plt.show()
COMMONAREA_MEDI 0.698563 COMMONAREA_MODE 0.698563 COMMONAREA_AVG 0.698563 NONLIVINGAPARTMENTS_MODE 0.694063 NONLIVINGAPARTMENTS_MEDI 0.694063 NONLIVINGAPARTMENTS_AVG 0.694063 LIVINGAPARTMENTS_MODE 0.683189 LIVINGAPARTMENTS_AVG 0.683189 LIVINGAPARTMENTS_MEDI 0.683189 FLOORSMIN_AVG 0.678230 FLOORSMIN_MODE 0.678230 FLOORSMIN_MEDI 0.678230 YEARS_BUILD_MEDI 0.664860 YEARS_BUILD_MODE 0.664860 YEARS_BUILD_AVG 0.664860 OWN_CAR_AGE 0.660218 LANDAREA_MODE 0.593684 LANDAREA_AVG 0.593684 LANDAREA_MEDI 0.593684 BASEMENTAREA_MEDI 0.585131 BASEMENTAREA_AVG 0.585131 BASEMENTAREA_MODE 0.585131 EXT_SOURCE_1 0.564339 NONLIVINGAREA_MODE 0.551962 NONLIVINGAREA_AVG 0.551962 NONLIVINGAREA_MEDI 0.551962 ELEVATORS_MEDI 0.532816 ELEVATORS_AVG 0.532816 ELEVATORS_MODE 0.532816 APARTMENTS_MEDI 0.507378 APARTMENTS_AVG 0.507378 APARTMENTS_MODE 0.507378 ENTRANCES_AVG 0.503451 ENTRANCES_MODE 0.503451 ENTRANCES_MEDI 0.503451 LIVINGAREA_MODE 0.501992 LIVINGAREA_MEDI 0.501992 LIVINGAREA_AVG 0.501992 FLOORSMAX_MODE 0.497557 FLOORSMAX_MEDI 0.497557 FLOORSMAX_AVG 0.497557 YEARS_BEGINEXPLUATATION_MODE 0.487618 YEARS_BEGINEXPLUATATION_MEDI 0.487618 YEARS_BEGINEXPLUATATION_AVG 0.487618 TOTALAREA_MODE 0.482557 EXT_SOURCE_3 0.198181 AMT_REQ_CREDIT_BUREAU_MON 0.134963 AMT_REQ_CREDIT_BUREAU_QRT 0.134963 AMT_REQ_CREDIT_BUREAU_YEAR 0.134963 AMT_REQ_CREDIT_BUREAU_WEEK 0.134963 AMT_REQ_CREDIT_BUREAU_DAY 0.134963 AMT_REQ_CREDIT_BUREAU_HOUR 0.134963 OBS_30_CNT_SOCIAL_CIRCLE 0.003362 DEF_30_CNT_SOCIAL_CIRCLE 0.003362 OBS_60_CNT_SOCIAL_CIRCLE 0.003362 DEF_60_CNT_SOCIAL_CIRCLE 0.003362 EXT_SOURCE_2 0.002126 AMT_GOODS_PRICE 0.000866 AMT_ANNUITY 0.000033 CNT_FAM_MEMBERS 0.000008 DAYS_LAST_PHONE_CHANGE 0.000004 AMT_CREDIT 0.000000 AMT_INCOME_TOTAL 0.000000 DAYS_ID_PUBLISH 0.000000 DAYS_REGISTRATION 0.000000 DAYS_EMPLOYED 0.000000 DAYS_BIRTH 0.000000 REGION_POPULATION_RELATIVE 0.000000 SK_ID_CURR 0.000000 dtype: float64
# Suponiendo que df_application_train y df_application_test son tus DataFrames originales
df_application_input_train = df_application_train.copy()
df_application_input_test = df_application_test.copy()
# Definir la lista de variables continuas excluyendo la variable objetivo
list_var_continuous = [col for col in df_application_input_train.columns if df_application_input_train[col].dtype in ['float64', 'int64'] and col != 'TARGET']
# Definir las columnas que no deben ser tocadas (protegidas)
protected_columns = ['OWN_CAR_AGE', 'EXT_SOURCE_1', 'EXT_SOURCE_2', 'EXT_SOURCE_3',
'OBS_30_CNT_SOCIAL_CIRCLE', 'DEF_30_CNT_SOCIAL_CIRCLE',
'OBS_60_CNT_SOCIAL_CIRCLE', 'DEF_60_CNT_SOCIAL_CIRCLE']
# Excluir estas columnas de la lista de imputación
list_vars_to_impute = [col for col in list_var_continuous if col not in protected_columns]
# Imputar valores nulos con -99 en las variables seleccionadas
df_application_input_train[list_vars_to_impute] = df_application_input_train[list_vars_to_impute].fillna(-99)
df_application_input_test[list_vars_to_impute] = df_application_input_test[list_vars_to_impute].fillna(-99)
# Verificar los resultados
print("Valores nulos en las columnas seleccionadas del conjunto de entrenamiento:")
print(df_application_input_train[list_vars_to_impute].isnull().sum())
print("Valores nulos en las columnas seleccionadas del conjunto de prueba:")
print(df_application_input_test[list_vars_to_impute].isnull().sum())
Valores nulos en las columnas seleccionadas del conjunto de entrenamiento: COMMONAREA_MEDI 0 COMMONAREA_AVG 0 COMMONAREA_MODE 0 NONLIVINGAPARTMENTS_MODE 0 NONLIVINGAPARTMENTS_AVG 0 NONLIVINGAPARTMENTS_MEDI 0 LIVINGAPARTMENTS_MODE 0 LIVINGAPARTMENTS_AVG 0 LIVINGAPARTMENTS_MEDI 0 FLOORSMIN_AVG 0 FLOORSMIN_MODE 0 FLOORSMIN_MEDI 0 YEARS_BUILD_MEDI 0 YEARS_BUILD_MODE 0 YEARS_BUILD_AVG 0 LANDAREA_MEDI 0 LANDAREA_MODE 0 LANDAREA_AVG 0 BASEMENTAREA_MEDI 0 BASEMENTAREA_AVG 0 BASEMENTAREA_MODE 0 NONLIVINGAREA_MODE 0 NONLIVINGAREA_AVG 0 NONLIVINGAREA_MEDI 0 ELEVATORS_MEDI 0 ELEVATORS_AVG 0 ELEVATORS_MODE 0 APARTMENTS_MEDI 0 APARTMENTS_AVG 0 APARTMENTS_MODE 0 ENTRANCES_MEDI 0 ENTRANCES_AVG 0 ENTRANCES_MODE 0 LIVINGAREA_AVG 0 LIVINGAREA_MODE 0 LIVINGAREA_MEDI 0 FLOORSMAX_MODE 0 FLOORSMAX_MEDI 0 FLOORSMAX_AVG 0 YEARS_BEGINEXPLUATATION_MODE 0 YEARS_BEGINEXPLUATATION_MEDI 0 YEARS_BEGINEXPLUATATION_AVG 0 TOTALAREA_MODE 0 AMT_REQ_CREDIT_BUREAU_HOUR 0 AMT_REQ_CREDIT_BUREAU_DAY 0 AMT_REQ_CREDIT_BUREAU_WEEK 0 AMT_REQ_CREDIT_BUREAU_MON 0 AMT_REQ_CREDIT_BUREAU_QRT 0 AMT_REQ_CREDIT_BUREAU_YEAR 0 AMT_GOODS_PRICE 0 AMT_ANNUITY 0 CNT_FAM_MEMBERS 0 DAYS_LAST_PHONE_CHANGE 0 AMT_CREDIT 0 AMT_INCOME_TOTAL 0 DAYS_ID_PUBLISH 0 DAYS_REGISTRATION 0 DAYS_EMPLOYED 0 DAYS_BIRTH 0 REGION_POPULATION_RELATIVE 0 SK_ID_CURR 0 dtype: int64 Valores nulos en las columnas seleccionadas del conjunto de prueba: COMMONAREA_MEDI 0 COMMONAREA_AVG 0 COMMONAREA_MODE 0 NONLIVINGAPARTMENTS_MODE 0 NONLIVINGAPARTMENTS_AVG 0 NONLIVINGAPARTMENTS_MEDI 0 LIVINGAPARTMENTS_MODE 0 LIVINGAPARTMENTS_AVG 0 LIVINGAPARTMENTS_MEDI 0 FLOORSMIN_AVG 0 FLOORSMIN_MODE 0 FLOORSMIN_MEDI 0 YEARS_BUILD_MEDI 0 YEARS_BUILD_MODE 0 YEARS_BUILD_AVG 0 LANDAREA_MEDI 0 LANDAREA_MODE 0 LANDAREA_AVG 0 BASEMENTAREA_MEDI 0 BASEMENTAREA_AVG 0 BASEMENTAREA_MODE 0 NONLIVINGAREA_MODE 0 NONLIVINGAREA_AVG 0 NONLIVINGAREA_MEDI 0 ELEVATORS_MEDI 0 ELEVATORS_AVG 0 ELEVATORS_MODE 0 APARTMENTS_MEDI 0 APARTMENTS_AVG 0 APARTMENTS_MODE 0 ENTRANCES_MEDI 0 ENTRANCES_AVG 0 ENTRANCES_MODE 0 LIVINGAREA_AVG 0 LIVINGAREA_MODE 0 LIVINGAREA_MEDI 0 FLOORSMAX_MODE 0 FLOORSMAX_MEDI 0 FLOORSMAX_AVG 0 YEARS_BEGINEXPLUATATION_MODE 0 YEARS_BEGINEXPLUATATION_MEDI 0 YEARS_BEGINEXPLUATATION_AVG 0 TOTALAREA_MODE 0 AMT_REQ_CREDIT_BUREAU_HOUR 0 AMT_REQ_CREDIT_BUREAU_DAY 0 AMT_REQ_CREDIT_BUREAU_WEEK 0 AMT_REQ_CREDIT_BUREAU_MON 0 AMT_REQ_CREDIT_BUREAU_QRT 0 AMT_REQ_CREDIT_BUREAU_YEAR 0 AMT_GOODS_PRICE 0 AMT_ANNUITY 0 CNT_FAM_MEMBERS 0 DAYS_LAST_PHONE_CHANGE 0 AMT_CREDIT 0 AMT_INCOME_TOTAL 0 DAYS_ID_PUBLISH 0 DAYS_REGISTRATION 0 DAYS_EMPLOYED 0 DAYS_BIRTH 0 REGION_POPULATION_RELATIVE 0 SK_ID_CURR 0 dtype: int64
list_vars_to_impute
['COMMONAREA_MEDI', 'COMMONAREA_AVG', 'COMMONAREA_MODE', 'NONLIVINGAPARTMENTS_MODE', 'NONLIVINGAPARTMENTS_AVG', 'NONLIVINGAPARTMENTS_MEDI', 'LIVINGAPARTMENTS_MODE', 'LIVINGAPARTMENTS_AVG', 'LIVINGAPARTMENTS_MEDI', 'FLOORSMIN_AVG', 'FLOORSMIN_MODE', 'FLOORSMIN_MEDI', 'YEARS_BUILD_MEDI', 'YEARS_BUILD_MODE', 'YEARS_BUILD_AVG', 'LANDAREA_MEDI', 'LANDAREA_MODE', 'LANDAREA_AVG', 'BASEMENTAREA_MEDI', 'BASEMENTAREA_AVG', 'BASEMENTAREA_MODE', 'NONLIVINGAREA_MODE', 'NONLIVINGAREA_AVG', 'NONLIVINGAREA_MEDI', 'ELEVATORS_MEDI', 'ELEVATORS_AVG', 'ELEVATORS_MODE', 'APARTMENTS_MEDI', 'APARTMENTS_AVG', 'APARTMENTS_MODE', 'ENTRANCES_MEDI', 'ENTRANCES_AVG', 'ENTRANCES_MODE', 'LIVINGAREA_AVG', 'LIVINGAREA_MODE', 'LIVINGAREA_MEDI', 'FLOORSMAX_MODE', 'FLOORSMAX_MEDI', 'FLOORSMAX_AVG', 'YEARS_BEGINEXPLUATATION_MODE', 'YEARS_BEGINEXPLUATATION_MEDI', 'YEARS_BEGINEXPLUATATION_AVG', 'TOTALAREA_MODE', 'AMT_REQ_CREDIT_BUREAU_HOUR', 'AMT_REQ_CREDIT_BUREAU_DAY', 'AMT_REQ_CREDIT_BUREAU_WEEK', 'AMT_REQ_CREDIT_BUREAU_MON', 'AMT_REQ_CREDIT_BUREAU_QRT', 'AMT_REQ_CREDIT_BUREAU_YEAR', 'AMT_GOODS_PRICE', 'AMT_ANNUITY', 'CNT_FAM_MEMBERS', 'DAYS_LAST_PHONE_CHANGE', 'AMT_CREDIT', 'AMT_INCOME_TOTAL', 'DAYS_ID_PUBLISH', 'DAYS_REGISTRATION', 'DAYS_EMPLOYED', 'DAYS_BIRTH', 'REGION_POPULATION_RELATIVE', 'SK_ID_CURR']
print(df_application_train.columns)
Index(['COMMONAREA_MEDI', 'COMMONAREA_AVG', 'COMMONAREA_MODE',
'NONLIVINGAPARTMENTS_MODE', 'NONLIVINGAPARTMENTS_AVG',
'NONLIVINGAPARTMENTS_MEDI', 'FONDKAPREMONT_MODE',
'LIVINGAPARTMENTS_MODE', 'LIVINGAPARTMENTS_AVG',
'LIVINGAPARTMENTS_MEDI',
...
'DAYS_REGISTRATION', 'DAYS_EMPLOYED', 'DAYS_BIRTH',
'REGION_POPULATION_RELATIVE', 'NAME_HOUSING_TYPE', 'NAME_FAMILY_STATUS',
'NAME_EDUCATION_TYPE', 'NAME_INCOME_TYPE', 'SK_ID_CURR', 'TARGET'],
dtype='object', length=122)
print(df_application_test.columns)
Index(['COMMONAREA_MEDI', 'COMMONAREA_AVG', 'COMMONAREA_MODE',
'NONLIVINGAPARTMENTS_MODE', 'NONLIVINGAPARTMENTS_AVG',
'NONLIVINGAPARTMENTS_MEDI', 'FONDKAPREMONT_MODE',
'LIVINGAPARTMENTS_MODE', 'LIVINGAPARTMENTS_AVG',
'LIVINGAPARTMENTS_MEDI',
...
'DAYS_REGISTRATION', 'DAYS_EMPLOYED', 'DAYS_BIRTH',
'REGION_POPULATION_RELATIVE', 'NAME_HOUSING_TYPE', 'NAME_FAMILY_STATUS',
'NAME_EDUCATION_TYPE', 'NAME_INCOME_TYPE', 'SK_ID_CURR', 'TARGET'],
dtype='object', length=122)
¿Por Qué Imputar en Ambos Conjuntos (Train y Test)?¶
Coherencia de Datos: Si imputas valores nulos en el conjunto de entrenamiento pero no en el de prueba, puedes introducir inconsistencias entre los dos conjuntos, lo que podría afectar la performance del modelo. La idea es que ambos conjuntos de datos deben pasar por el mismo proceso de preprocesamiento para asegurar que las distribuciones de datos sean coherentes.
Mismas Transformaciones: Las mismas transformaciones que aplicas al conjunto de entrenamiento deben aplicarse al conjunto de prueba para que el modelo pueda hacer predicciones correctamente. Esto incluye cualquier tipo de escalado, imputación, codificación de variables, etc.
Tratamiento de las variables categoricas¶
Para calcular la correlación de Spearman, es imprescindible convertir las variables categóricas en numéricas. Esta conversión permite medir la relación entre estas variables mediante coeficientes de correlación.
En primer lugar, se aplicará el coeficiente V de Cramer. Este método es útil para evaluar la asociación entre variables categóricas y permite una mejor comprensión de las interdependencias en el conjunto de datos. Para más detalles sobre la implementación de este método, puedes consultar este recurso en Stack Overflow: https://stackoverflow.com/questions/46498455/categorical-features-correlation
Esta aproximación garantiza que las variables categóricas sean adecuadamente preprocesadas para su análisis y posterior utilización en modelos predictivos.n
list_var_cat
['FONDKAPREMONT_MODE', 'WALLSMATERIAL_MODE', 'HOUSETYPE_MODE', 'EMERGENCYSTATE_MODE', 'OCCUPATION_TYPE', 'NAME_TYPE_SUITE', 'CNT_CHILDREN', 'FLAG_DOCUMENT_8', 'NAME_CONTRACT_TYPE', 'CODE_GENDER', 'FLAG_OWN_CAR', 'FLAG_DOCUMENT_2', 'FLAG_DOCUMENT_3', 'FLAG_DOCUMENT_4', 'FLAG_DOCUMENT_5', 'FLAG_DOCUMENT_6', 'FLAG_DOCUMENT_7', 'FLAG_DOCUMENT_9', 'FLAG_DOCUMENT_21', 'FLAG_DOCUMENT_10', 'FLAG_DOCUMENT_11', 'FLAG_OWN_REALTY', 'FLAG_DOCUMENT_13', 'FLAG_DOCUMENT_14', 'FLAG_DOCUMENT_15', 'FLAG_DOCUMENT_16', 'FLAG_DOCUMENT_17', 'FLAG_DOCUMENT_18', 'FLAG_DOCUMENT_19', 'FLAG_DOCUMENT_20', 'FLAG_DOCUMENT_12', 'FLAG_PHONE', 'LIVE_CITY_NOT_WORK_CITY', 'REG_CITY_NOT_WORK_CITY', 'TARGET', 'REG_CITY_NOT_LIVE_CITY', 'LIVE_REGION_NOT_WORK_REGION', 'REG_REGION_NOT_WORK_REGION', 'REG_REGION_NOT_LIVE_REGION', 'HOUR_APPR_PROCESS_START', 'WEEKDAY_APPR_PROCESS_START', 'REGION_RATING_CLIENT_W_CITY', 'REGION_RATING_CLIENT', 'FLAG_EMAIL', 'FLAG_CONT_MOBILE', 'ORGANIZATION_TYPE', 'FLAG_WORK_PHONE', 'FLAG_EMP_PHONE', 'FLAG_MOBIL', 'NAME_HOUSING_TYPE', 'NAME_FAMILY_STATUS', 'NAME_EDUCATION_TYPE', 'NAME_INCOME_TYPE']
Coeficiente V de Cramer¶
import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency
def cramers_v(x, y):
""" Calcular el coeficiente V de Cramer para la asociación entre dos variables categóricas """
# Remover valores nulos
x = x.dropna()
y = y.dropna()
# Solo calcular si ambas variables tienen datos
if x.empty or y.empty:
return np.nan
confusion_matrix = pd.crosstab(x, y)
if confusion_matrix.shape[0] == 1 or confusion_matrix.shape[1] == 1:
return np.nan
chi2 = chi2_contingency(confusion_matrix)[0]
n = confusion_matrix.sum().sum()
return np.sqrt(chi2 / (n * (min(confusion_matrix.shape) - 1)))
# Calcular V de Cramer por lotes de 2 en 2
lote_size = 2
for i in range(0, len(list_var_cat), lote_size):
current_vars = list_var_cat[i:i + lote_size]
cramers_v_matrix = pd.DataFrame(index=current_vars, columns=current_vars)
for var1 in current_vars:
for var2 in current_vars:
if var1 == var2:
cramers_v_matrix.loc[var1, var2] = 1.0
else:
# Combinar los datos y eliminar filas con NaN
combined = pd.concat([df_application_input_train[var1], df_application_input_train[var2]], axis=1).dropna()
if combined.empty or combined[var1].nunique() < 2 or combined[var2].nunique() < 2:
cramers_v_matrix.loc[var1, var2] = np.nan
else:
cramers_v_matrix.loc[var1, var2] = cramers_v(combined[var1], combined[var2])
# Convertir a tipo numérico
cramers_v_matrix = cramers_v_matrix.astype(float)
# Visualizar la matriz del lote actual
print(f"Matriz de V de Cramer para el lote {i // lote_size + 1}:")
print(cramers_v_matrix)
Matriz de V de Cramer para el lote 1:
FONDKAPREMONT_MODE WALLSMATERIAL_MODE
FONDKAPREMONT_MODE 1.000000 0.108164
WALLSMATERIAL_MODE 0.108164 1.000000
Matriz de V de Cramer para el lote 2:
HOUSETYPE_MODE EMERGENCYSTATE_MODE
HOUSETYPE_MODE 1.000000 0.034749
EMERGENCYSTATE_MODE 0.034749 1.000000
Matriz de V de Cramer para el lote 3:
OCCUPATION_TYPE NAME_TYPE_SUITE
OCCUPATION_TYPE 1.000000 0.023537
NAME_TYPE_SUITE 0.023537 1.000000
Matriz de V de Cramer para el lote 4:
CNT_CHILDREN FLAG_DOCUMENT_8
CNT_CHILDREN 1.000000 0.057721
FLAG_DOCUMENT_8 0.057721 1.000000
Matriz de V de Cramer para el lote 5:
NAME_CONTRACT_TYPE CODE_GENDER
NAME_CONTRACT_TYPE 1.000000 0.013234
CODE_GENDER 0.013234 1.000000
Matriz de V de Cramer para el lote 6:
FLAG_OWN_CAR FLAG_DOCUMENT_2
FLAG_OWN_CAR 1.000000 0.000305
FLAG_DOCUMENT_2 0.000305 1.000000
Matriz de V de Cramer para el lote 7:
FLAG_DOCUMENT_3 FLAG_DOCUMENT_4
FLAG_DOCUMENT_3 1.000000 0.014649
FLAG_DOCUMENT_4 0.014649 1.000000
Matriz de V de Cramer para el lote 8:
FLAG_DOCUMENT_5 FLAG_DOCUMENT_6
FLAG_DOCUMENT_5 1.000000 0.038735
FLAG_DOCUMENT_6 0.038735 1.000000
Matriz de V de Cramer para el lote 9:
FLAG_DOCUMENT_7 FLAG_DOCUMENT_9
FLAG_DOCUMENT_7 1.0 0.0
FLAG_DOCUMENT_9 0.0 1.0
Matriz de V de Cramer para el lote 10:
FLAG_DOCUMENT_21 FLAG_DOCUMENT_10
FLAG_DOCUMENT_21 1.0 0.0
FLAG_DOCUMENT_10 0.0 1.0
Matriz de V de Cramer para el lote 11:
FLAG_DOCUMENT_11 FLAG_OWN_REALTY
FLAG_DOCUMENT_11 1.000000 0.034342
FLAG_OWN_REALTY 0.034342 1.000000
Matriz de V de Cramer para el lote 12:
FLAG_DOCUMENT_13 FLAG_DOCUMENT_14
FLAG_DOCUMENT_13 1.000000 0.002551
FLAG_DOCUMENT_14 0.002551 1.000000
Matriz de V de Cramer para el lote 13:
FLAG_DOCUMENT_15 FLAG_DOCUMENT_16
FLAG_DOCUMENT_15 1.000000 0.002827
FLAG_DOCUMENT_16 0.002827 1.000000
Matriz de V de Cramer para el lote 14:
FLAG_DOCUMENT_17 FLAG_DOCUMENT_18
FLAG_DOCUMENT_17 1.0 0.0
FLAG_DOCUMENT_18 0.0 1.0
Matriz de V de Cramer para el lote 15:
FLAG_DOCUMENT_19 FLAG_DOCUMENT_20
FLAG_DOCUMENT_19 1.000000 0.018176
FLAG_DOCUMENT_20 0.018176 1.000000
Matriz de V de Cramer para el lote 16:
FLAG_DOCUMENT_12 FLAG_PHONE
FLAG_DOCUMENT_12 1.000000 0.000198
FLAG_PHONE 0.000198 1.000000
Matriz de V de Cramer para el lote 17:
LIVE_CITY_NOT_WORK_CITY REG_CITY_NOT_WORK_CITY
LIVE_CITY_NOT_WORK_CITY 1.000000 0.825153
REG_CITY_NOT_WORK_CITY 0.825153 1.000000
Matriz de V de Cramer para el lote 18:
TARGET REG_CITY_NOT_LIVE_CITY
TARGET 1.000000 0.041644
REG_CITY_NOT_LIVE_CITY 0.041644 1.000000
Matriz de V de Cramer para el lote 19:
LIVE_REGION_NOT_WORK_REGION \
LIVE_REGION_NOT_WORK_REGION 1.000000
REG_REGION_NOT_WORK_REGION 0.859723
REG_REGION_NOT_WORK_REGION
LIVE_REGION_NOT_WORK_REGION 0.859723
REG_REGION_NOT_WORK_REGION 1.000000
Matriz de V de Cramer para el lote 20:
REG_REGION_NOT_LIVE_REGION \
REG_REGION_NOT_LIVE_REGION 1.000000
HOUR_APPR_PROCESS_START 0.061884
HOUR_APPR_PROCESS_START
REG_REGION_NOT_LIVE_REGION 0.061884
HOUR_APPR_PROCESS_START 1.000000
Matriz de V de Cramer para el lote 21:
WEEKDAY_APPR_PROCESS_START \
WEEKDAY_APPR_PROCESS_START 1.000000
REGION_RATING_CLIENT_W_CITY 0.017773
REGION_RATING_CLIENT_W_CITY
WEEKDAY_APPR_PROCESS_START 0.017773
REGION_RATING_CLIENT_W_CITY 1.000000
Matriz de V de Cramer para el lote 22:
REGION_RATING_CLIENT FLAG_EMAIL
REGION_RATING_CLIENT 1.000000 0.065856
FLAG_EMAIL 0.065856 1.000000
Matriz de V de Cramer para el lote 23:
FLAG_CONT_MOBILE ORGANIZATION_TYPE
FLAG_CONT_MOBILE 1.000000 0.025672
ORGANIZATION_TYPE 0.025672 1.000000
Matriz de V de Cramer para el lote 24:
FLAG_WORK_PHONE FLAG_EMP_PHONE
FLAG_WORK_PHONE 1.000000 0.233879
FLAG_EMP_PHONE 0.233879 1.000000
Matriz de V de Cramer para el lote 25:
FLAG_MOBIL NAME_HOUSING_TYPE
FLAG_MOBIL 1.000000 0.000718
NAME_HOUSING_TYPE 0.000718 1.000000
Matriz de V de Cramer para el lote 26:
NAME_FAMILY_STATUS NAME_EDUCATION_TYPE
NAME_FAMILY_STATUS 1.00000 0.05282
NAME_EDUCATION_TYPE 0.05282 1.00000
Matriz de V de Cramer para el lote 27:
NAME_INCOME_TYPE
NAME_INCOME_TYPE 1.0
Principales resultados:¶
Relación entre Variables Categóricas: A partir de los cálculos del coeficiente V de Cramer, se puede observar que la mayoría de las asociaciones entre variables categóricas son bastante débiles, con coeficientes generalmente bajos, como por ejemplo, HOUSETYPE_MODE y EMERGENCYSTATE_MODE con un valor de 0.033394. Esto sugiere que no hay una fuerte relación entre muchas de las variables categóricas en el conjunto de datos, lo cual puede ser interpretado como una indicación de independencia entre estas variables.
Identificación de Relaciones Significativas: Sin embargo, algunas combinaciones muestran una asociación más fuerte, como LIVE_CITY_NOT_WORK_CITY y REG_CITY_NOT_WORK_CITY con un coeficiente de 0.824967, lo que indica una relación significativa entre estas variables. Este resultado es lógico, ya que es probable que las personas que viven en la misma ciudad en la que trabajan también registren su residencia en esa ciudad. Otro ejemplo es LIVE_REGION_NOT_WORK_REGION y REG_REGION_NOT_WORK_REGION con un valor de 0.861444, lo que refuerza la importancia de considerar estas asociaciones durante el análisis y modelado.
# Mostrar los primeros valores de las columnas categóricas
for col in list_var_cat:
print(f"Valores únicos en la columna '{col}':")
print(df_application_input_train[col].unique())
print("\n")
Valores únicos en la columna 'FONDKAPREMONT_MODE': ['reg oper account', NaN, 'reg oper spec account', 'not specified', 'org spec account'] Categories (4, object): ['reg oper account', 'reg oper spec account', 'not specified', 'org spec account'] Valores únicos en la columna 'WALLSMATERIAL_MODE': ['Stone, brick', 'Block', 'Panel', NaN, 'Mixed', 'Others', 'Wooden', 'Monolithic'] Categories (7, object): ['Stone, brick', 'Block', 'Panel', 'Mixed', 'Others', 'Wooden', 'Monolithic'] Valores únicos en la columna 'HOUSETYPE_MODE': ['block of flats', NaN, 'terraced house', 'specific housing'] Categories (3, object): ['block of flats', 'terraced house', 'specific housing'] Valores únicos en la columna 'EMERGENCYSTATE_MODE': ['No', NaN, 'Yes'] Categories (2, object): ['No', 'Yes'] Valores únicos en la columna 'OCCUPATION_TYPE': ['Managers', 'High skill tech staff', 'Medicine staff', 'Drivers', NaN, ..., 'Waiters/barmen staff', 'IT staff', 'Secretaries', 'Low-skill Laborers', 'HR staff'] Length: 19 Categories (18, object): ['Managers', 'High skill tech staff', 'Medicine staff', 'Drivers', ..., 'IT staff', 'Secretaries', 'Low-skill Laborers', 'HR staff'] Valores únicos en la columna 'NAME_TYPE_SUITE': ['Unaccompanied', 'Spouse, partner', 'Family', 'Group of people', 'Other_A', 'Other_B', 'Children', NaN] Categories (7, object): ['Unaccompanied', 'Spouse, partner', 'Family', 'Group of people', 'Other_A', 'Other_B', 'Children'] Valores únicos en la columna 'CNT_CHILDREN': [1, 0, 2, 3, 4, ..., 8, 12, 9, 11, 19] Length: 15 Categories (15, int64): [1, 0, 2, 3, ..., 12, 9, 11, 19] Valores únicos en la columna 'FLAG_DOCUMENT_8': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'NAME_CONTRACT_TYPE': ['Cash loans', 'Revolving loans'] Categories (2, object): ['Cash loans', 'Revolving loans'] Valores únicos en la columna 'CODE_GENDER': ['F', 'M', 'XNA'] Categories (3, object): ['F', 'M', 'XNA'] Valores únicos en la columna 'FLAG_OWN_CAR': ['Y', 'N'] Categories (2, object): ['Y', 'N'] Valores únicos en la columna 'FLAG_DOCUMENT_2': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_3': [1, 0] Categories (2, int64): [1, 0] Valores únicos en la columna 'FLAG_DOCUMENT_4': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_5': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_6': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_7': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_9': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_21': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_10': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_11': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_OWN_REALTY': ['Y', 'N'] Categories (2, object): ['Y', 'N'] Valores únicos en la columna 'FLAG_DOCUMENT_13': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_14': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_15': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_16': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_17': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_18': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_19': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_20': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_DOCUMENT_12': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_PHONE': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'LIVE_CITY_NOT_WORK_CITY': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'REG_CITY_NOT_WORK_CITY': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'TARGET': [1, 0] Categories (2, int64): [1, 0] Valores únicos en la columna 'REG_CITY_NOT_LIVE_CITY': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'LIVE_REGION_NOT_WORK_REGION': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'REG_REGION_NOT_WORK_REGION': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'REG_REGION_NOT_LIVE_REGION': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'HOUR_APPR_PROCESS_START': [7, 11, 18, 10, 5, ..., 2, 22, 1, 0, 23] Length: 24 Categories (24, int64): [7, 11, 18, 10, ..., 22, 1, 0, 23] Valores únicos en la columna 'WEEKDAY_APPR_PROCESS_START': ['FRIDAY', 'MONDAY', 'WEDNESDAY', 'THURSDAY', 'SATURDAY', 'SUNDAY', 'TUESDAY'] Categories (7, object): ['FRIDAY', 'MONDAY', 'WEDNESDAY', 'THURSDAY', 'SATURDAY', 'SUNDAY', 'TUESDAY'] Valores únicos en la columna 'REGION_RATING_CLIENT_W_CITY': [2, 1, 3] Categories (3, int64): [2, 1, 3] Valores únicos en la columna 'REGION_RATING_CLIENT': [2, 1, 3] Categories (3, int64): [2, 1, 3] Valores únicos en la columna 'FLAG_EMAIL': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_CONT_MOBILE': [1, 0] Categories (2, int64): [1, 0] Valores únicos en la columna 'ORGANIZATION_TYPE': ['Business Entity Type 3', 'Self-employed', 'Medicine', 'Military', 'XNA', ..., 'Trade: type 4', 'Industry: type 13', 'Trade: type 5', 'Industry: type 8', 'Religion'] Length: 58 Categories (58, object): ['Business Entity Type 3', 'Self-employed', 'Medicine', 'Military', ..., 'Industry: type 13', 'Trade: type 5', 'Industry: type 8', 'Religion'] Valores únicos en la columna 'FLAG_WORK_PHONE': [0, 1] Categories (2, int64): [0, 1] Valores únicos en la columna 'FLAG_EMP_PHONE': [1, 0] Categories (2, int64): [1, 0] Valores únicos en la columna 'FLAG_MOBIL': [1, 0] Categories (2, int64): [1, 0] Valores únicos en la columna 'NAME_HOUSING_TYPE': ['House / apartment', 'Office apartment', 'Rented apartment', 'Municipal apartment', 'With parents', 'Co-op apartment'] Categories (6, object): ['House / apartment', 'Office apartment', 'Rented apartment', 'Municipal apartment', 'With parents', 'Co-op apartment'] Valores únicos en la columna 'NAME_FAMILY_STATUS': ['Married', 'Single / not married', 'Civil marriage', 'Widow', 'Separated', 'Unknown'] Categories (6, object): ['Married', 'Single / not married', 'Civil marriage', 'Widow', 'Separated', 'Unknown'] Valores únicos en la columna 'NAME_EDUCATION_TYPE': ['Secondary / secondary special', 'Higher education', 'Incomplete higher', 'Lower secondary', 'Academic degree'] Categories (5, object): ['Secondary / secondary special', 'Higher education', 'Incomplete higher', 'Lower secondary', 'Academic degree'] Valores únicos en la columna 'NAME_INCOME_TYPE': ['Working', 'State servant', 'Pensioner', 'Commercial associate', 'Student', 'Unemployed', 'Businessman', 'Maternity leave'] Categories (8, object): ['Working', 'State servant', 'Pensioner', 'Commercial associate', 'Student', 'Unemployed', 'Businessman', 'Maternity leave']
# Verificar la cantidad de valores nulos en las variables categóricas
print("Valores nulos en las variables categóricas:")
print(df_application_input_train[list_var_cat].isnull().sum())
# Verificar la cantidad de valores no nulos en las variables categóricas
print("Valores no nulos en las variables categóricas:")
print(df_application_input_train[list_var_cat].notnull().sum())
Valores nulos en las variables categóricas: FONDKAPREMONT_MODE 168176 WALLSMATERIAL_MODE 125067 HOUSETYPE_MODE 123436 EMERGENCYSTATE_MODE 116585 OCCUPATION_TYPE 77233 NAME_TYPE_SUITE 1019 CNT_CHILDREN 0 FLAG_DOCUMENT_8 0 NAME_CONTRACT_TYPE 0 CODE_GENDER 0 FLAG_OWN_CAR 0 FLAG_DOCUMENT_2 0 FLAG_DOCUMENT_3 0 FLAG_DOCUMENT_4 0 FLAG_DOCUMENT_5 0 FLAG_DOCUMENT_6 0 FLAG_DOCUMENT_7 0 FLAG_DOCUMENT_9 0 FLAG_DOCUMENT_21 0 FLAG_DOCUMENT_10 0 FLAG_DOCUMENT_11 0 FLAG_OWN_REALTY 0 FLAG_DOCUMENT_13 0 FLAG_DOCUMENT_14 0 FLAG_DOCUMENT_15 0 FLAG_DOCUMENT_16 0 FLAG_DOCUMENT_17 0 FLAG_DOCUMENT_18 0 FLAG_DOCUMENT_19 0 FLAG_DOCUMENT_20 0 FLAG_DOCUMENT_12 0 FLAG_PHONE 0 LIVE_CITY_NOT_WORK_CITY 0 REG_CITY_NOT_WORK_CITY 0 TARGET 0 REG_CITY_NOT_LIVE_CITY 0 LIVE_REGION_NOT_WORK_REGION 0 REG_REGION_NOT_WORK_REGION 0 REG_REGION_NOT_LIVE_REGION 0 HOUR_APPR_PROCESS_START 0 WEEKDAY_APPR_PROCESS_START 0 REGION_RATING_CLIENT_W_CITY 0 REGION_RATING_CLIENT 0 FLAG_EMAIL 0 FLAG_CONT_MOBILE 0 ORGANIZATION_TYPE 0 FLAG_WORK_PHONE 0 FLAG_EMP_PHONE 0 FLAG_MOBIL 0 NAME_HOUSING_TYPE 0 NAME_FAMILY_STATUS 0 NAME_EDUCATION_TYPE 0 NAME_INCOME_TYPE 0 dtype: int64 Valores no nulos en las variables categóricas: FONDKAPREMONT_MODE 77832 WALLSMATERIAL_MODE 120941 HOUSETYPE_MODE 122572 EMERGENCYSTATE_MODE 129423 OCCUPATION_TYPE 168775 NAME_TYPE_SUITE 244989 CNT_CHILDREN 246008 FLAG_DOCUMENT_8 246008 NAME_CONTRACT_TYPE 246008 CODE_GENDER 246008 FLAG_OWN_CAR 246008 FLAG_DOCUMENT_2 246008 FLAG_DOCUMENT_3 246008 FLAG_DOCUMENT_4 246008 FLAG_DOCUMENT_5 246008 FLAG_DOCUMENT_6 246008 FLAG_DOCUMENT_7 246008 FLAG_DOCUMENT_9 246008 FLAG_DOCUMENT_21 246008 FLAG_DOCUMENT_10 246008 FLAG_DOCUMENT_11 246008 FLAG_OWN_REALTY 246008 FLAG_DOCUMENT_13 246008 FLAG_DOCUMENT_14 246008 FLAG_DOCUMENT_15 246008 FLAG_DOCUMENT_16 246008 FLAG_DOCUMENT_17 246008 FLAG_DOCUMENT_18 246008 FLAG_DOCUMENT_19 246008 FLAG_DOCUMENT_20 246008 FLAG_DOCUMENT_12 246008 FLAG_PHONE 246008 LIVE_CITY_NOT_WORK_CITY 246008 REG_CITY_NOT_WORK_CITY 246008 TARGET 246008 REG_CITY_NOT_LIVE_CITY 246008 LIVE_REGION_NOT_WORK_REGION 246008 REG_REGION_NOT_WORK_REGION 246008 REG_REGION_NOT_LIVE_REGION 246008 HOUR_APPR_PROCESS_START 246008 WEEKDAY_APPR_PROCESS_START 246008 REGION_RATING_CLIENT_W_CITY 246008 REGION_RATING_CLIENT 246008 FLAG_EMAIL 246008 FLAG_CONT_MOBILE 246008 ORGANIZATION_TYPE 246008 FLAG_WORK_PHONE 246008 FLAG_EMP_PHONE 246008 FLAG_MOBIL 246008 NAME_HOUSING_TYPE 246008 NAME_FAMILY_STATUS 246008 NAME_EDUCATION_TYPE 246008 NAME_INCOME_TYPE 246008 dtype: int64
# Verificar la cantidad de valores nulos en las variables categóricas
print("Valores nulos en las variables categóricas:")
print(df_application_input_test[list_var_cat].isnull().sum())
# Verificar la cantidad de valores no nulos en las variables categóricas
print("Valores no nulos en las variables categóricas:")
print(df_application_input_test[list_var_cat].notnull().sum())
Valores nulos en las variables categóricas: FONDKAPREMONT_MODE 42119 WALLSMATERIAL_MODE 31274 HOUSETYPE_MODE 30861 EMERGENCYSTATE_MODE 29170 OCCUPATION_TYPE 19158 NAME_TYPE_SUITE 273 CNT_CHILDREN 0 FLAG_DOCUMENT_8 0 NAME_CONTRACT_TYPE 0 CODE_GENDER 0 FLAG_OWN_CAR 0 FLAG_DOCUMENT_2 0 FLAG_DOCUMENT_3 0 FLAG_DOCUMENT_4 0 FLAG_DOCUMENT_5 0 FLAG_DOCUMENT_6 0 FLAG_DOCUMENT_7 0 FLAG_DOCUMENT_9 0 FLAG_DOCUMENT_21 0 FLAG_DOCUMENT_10 0 FLAG_DOCUMENT_11 0 FLAG_OWN_REALTY 0 FLAG_DOCUMENT_13 0 FLAG_DOCUMENT_14 0 FLAG_DOCUMENT_15 0 FLAG_DOCUMENT_16 0 FLAG_DOCUMENT_17 0 FLAG_DOCUMENT_18 0 FLAG_DOCUMENT_19 0 FLAG_DOCUMENT_20 0 FLAG_DOCUMENT_12 0 FLAG_PHONE 0 LIVE_CITY_NOT_WORK_CITY 0 REG_CITY_NOT_WORK_CITY 0 TARGET 0 REG_CITY_NOT_LIVE_CITY 0 LIVE_REGION_NOT_WORK_REGION 0 REG_REGION_NOT_WORK_REGION 0 REG_REGION_NOT_LIVE_REGION 0 HOUR_APPR_PROCESS_START 0 WEEKDAY_APPR_PROCESS_START 0 REGION_RATING_CLIENT_W_CITY 0 REGION_RATING_CLIENT 0 FLAG_EMAIL 0 FLAG_CONT_MOBILE 0 ORGANIZATION_TYPE 0 FLAG_WORK_PHONE 0 FLAG_EMP_PHONE 0 FLAG_MOBIL 0 NAME_HOUSING_TYPE 0 NAME_FAMILY_STATUS 0 NAME_EDUCATION_TYPE 0 NAME_INCOME_TYPE 0 dtype: int64 Valores no nulos en las variables categóricas: FONDKAPREMONT_MODE 19384 WALLSMATERIAL_MODE 30229 HOUSETYPE_MODE 30642 EMERGENCYSTATE_MODE 32333 OCCUPATION_TYPE 42345 NAME_TYPE_SUITE 61230 CNT_CHILDREN 61503 FLAG_DOCUMENT_8 61503 NAME_CONTRACT_TYPE 61503 CODE_GENDER 61503 FLAG_OWN_CAR 61503 FLAG_DOCUMENT_2 61503 FLAG_DOCUMENT_3 61503 FLAG_DOCUMENT_4 61503 FLAG_DOCUMENT_5 61503 FLAG_DOCUMENT_6 61503 FLAG_DOCUMENT_7 61503 FLAG_DOCUMENT_9 61503 FLAG_DOCUMENT_21 61503 FLAG_DOCUMENT_10 61503 FLAG_DOCUMENT_11 61503 FLAG_OWN_REALTY 61503 FLAG_DOCUMENT_13 61503 FLAG_DOCUMENT_14 61503 FLAG_DOCUMENT_15 61503 FLAG_DOCUMENT_16 61503 FLAG_DOCUMENT_17 61503 FLAG_DOCUMENT_18 61503 FLAG_DOCUMENT_19 61503 FLAG_DOCUMENT_20 61503 FLAG_DOCUMENT_12 61503 FLAG_PHONE 61503 LIVE_CITY_NOT_WORK_CITY 61503 REG_CITY_NOT_WORK_CITY 61503 TARGET 61503 REG_CITY_NOT_LIVE_CITY 61503 LIVE_REGION_NOT_WORK_REGION 61503 REG_REGION_NOT_WORK_REGION 61503 REG_REGION_NOT_LIVE_REGION 61503 HOUR_APPR_PROCESS_START 61503 WEEKDAY_APPR_PROCESS_START 61503 REGION_RATING_CLIENT_W_CITY 61503 REGION_RATING_CLIENT 61503 FLAG_EMAIL 61503 FLAG_CONT_MOBILE 61503 ORGANIZATION_TYPE 61503 FLAG_WORK_PHONE 61503 FLAG_EMP_PHONE 61503 FLAG_MOBIL 61503 NAME_HOUSING_TYPE 61503 NAME_FAMILY_STATUS 61503 NAME_EDUCATION_TYPE 61503 NAME_INCOME_TYPE 61503 dtype: int64
Sustitución de valores nulos en variables categóricas¶
# Sustituir valores nulos por "SIN VALOR" en variables categóricas
df_application_input_train[list_var_cat] = df_application_input_train[list_var_cat].astype("object").fillna("SIN VALOR").astype("category")
df_application_input_test[list_var_cat] = df_application_input_test[list_var_cat].astype("object").fillna("SIN VALOR").astype("category")
# Verificar los resultados
print("Valores nulos en las variables categóricas del conjunto de entrenamiento:")
print(df_application_input_train[list_var_cat].isnull().sum())
print("Valores nulos en las variables categóricas del conjunto de prueba:")
print(df_application_input_test[list_var_cat].isnull().sum())
Valores nulos en las variables categóricas del conjunto de entrenamiento: FONDKAPREMONT_MODE 0 WALLSMATERIAL_MODE 0 HOUSETYPE_MODE 0 EMERGENCYSTATE_MODE 0 OCCUPATION_TYPE 0 NAME_TYPE_SUITE 0 CNT_CHILDREN 0 FLAG_DOCUMENT_8 0 NAME_CONTRACT_TYPE 0 CODE_GENDER 0 FLAG_OWN_CAR 0 FLAG_DOCUMENT_2 0 FLAG_DOCUMENT_3 0 FLAG_DOCUMENT_4 0 FLAG_DOCUMENT_5 0 FLAG_DOCUMENT_6 0 FLAG_DOCUMENT_7 0 FLAG_DOCUMENT_9 0 FLAG_DOCUMENT_21 0 FLAG_DOCUMENT_10 0 FLAG_DOCUMENT_11 0 FLAG_OWN_REALTY 0 FLAG_DOCUMENT_13 0 FLAG_DOCUMENT_14 0 FLAG_DOCUMENT_15 0 FLAG_DOCUMENT_16 0 FLAG_DOCUMENT_17 0 FLAG_DOCUMENT_18 0 FLAG_DOCUMENT_19 0 FLAG_DOCUMENT_20 0 FLAG_DOCUMENT_12 0 FLAG_PHONE 0 LIVE_CITY_NOT_WORK_CITY 0 REG_CITY_NOT_WORK_CITY 0 TARGET 0 REG_CITY_NOT_LIVE_CITY 0 LIVE_REGION_NOT_WORK_REGION 0 REG_REGION_NOT_WORK_REGION 0 REG_REGION_NOT_LIVE_REGION 0 HOUR_APPR_PROCESS_START 0 WEEKDAY_APPR_PROCESS_START 0 REGION_RATING_CLIENT_W_CITY 0 REGION_RATING_CLIENT 0 FLAG_EMAIL 0 FLAG_CONT_MOBILE 0 ORGANIZATION_TYPE 0 FLAG_WORK_PHONE 0 FLAG_EMP_PHONE 0 FLAG_MOBIL 0 NAME_HOUSING_TYPE 0 NAME_FAMILY_STATUS 0 NAME_EDUCATION_TYPE 0 NAME_INCOME_TYPE 0 dtype: int64 Valores nulos en las variables categóricas del conjunto de prueba: FONDKAPREMONT_MODE 0 WALLSMATERIAL_MODE 0 HOUSETYPE_MODE 0 EMERGENCYSTATE_MODE 0 OCCUPATION_TYPE 0 NAME_TYPE_SUITE 0 CNT_CHILDREN 0 FLAG_DOCUMENT_8 0 NAME_CONTRACT_TYPE 0 CODE_GENDER 0 FLAG_OWN_CAR 0 FLAG_DOCUMENT_2 0 FLAG_DOCUMENT_3 0 FLAG_DOCUMENT_4 0 FLAG_DOCUMENT_5 0 FLAG_DOCUMENT_6 0 FLAG_DOCUMENT_7 0 FLAG_DOCUMENT_9 0 FLAG_DOCUMENT_21 0 FLAG_DOCUMENT_10 0 FLAG_DOCUMENT_11 0 FLAG_OWN_REALTY 0 FLAG_DOCUMENT_13 0 FLAG_DOCUMENT_14 0 FLAG_DOCUMENT_15 0 FLAG_DOCUMENT_16 0 FLAG_DOCUMENT_17 0 FLAG_DOCUMENT_18 0 FLAG_DOCUMENT_19 0 FLAG_DOCUMENT_20 0 FLAG_DOCUMENT_12 0 FLAG_PHONE 0 LIVE_CITY_NOT_WORK_CITY 0 REG_CITY_NOT_WORK_CITY 0 TARGET 0 REG_CITY_NOT_LIVE_CITY 0 LIVE_REGION_NOT_WORK_REGION 0 REG_REGION_NOT_WORK_REGION 0 REG_REGION_NOT_LIVE_REGION 0 HOUR_APPR_PROCESS_START 0 WEEKDAY_APPR_PROCESS_START 0 REGION_RATING_CLIENT_W_CITY 0 REGION_RATING_CLIENT 0 FLAG_EMAIL 0 FLAG_CONT_MOBILE 0 ORGANIZATION_TYPE 0 FLAG_WORK_PHONE 0 FLAG_EMP_PHONE 0 FLAG_MOBIL 0 NAME_HOUSING_TYPE 0 NAME_FAMILY_STATUS 0 NAME_EDUCATION_TYPE 0 NAME_INCOME_TYPE 0 dtype: int64
Cuando se reemplazaron los valores nulos con "SIN VALOR", las columnas que antes tenían valores nulos ahora tienen un valor no nulo (específicamente el texto "SIN VALOR"). Así, el conteo de valores nulos se volvió 0 para esas columnas.
# Para comprobar
# Ver las primeras filas del conjunto de entrenamiento
print("Primeras filas del conjunto de entrenamiento:")
print(df_application_input_train[list_var_cat].head())
# Ver las primeras filas del conjunto de prueba
print("Primeras filas del conjunto de prueba:")
print(df_application_input_test[list_var_cat].head())
Primeras filas del conjunto de entrenamiento:
FONDKAPREMONT_MODE WALLSMATERIAL_MODE HOUSETYPE_MODE \
47185 reg oper account Stone, brick block of flats
133243 SIN VALOR Block block of flats
259367 reg oper account Panel block of flats
219323 SIN VALOR Panel block of flats
256066 SIN VALOR SIN VALOR SIN VALOR
EMERGENCYSTATE_MODE OCCUPATION_TYPE NAME_TYPE_SUITE \
47185 No Managers Unaccompanied
133243 No High skill tech staff Unaccompanied
259367 No Medicine staff Unaccompanied
219323 No Medicine staff Unaccompanied
256066 SIN VALOR Drivers Spouse, partner
CNT_CHILDREN FLAG_DOCUMENT_8 NAME_CONTRACT_TYPE CODE_GENDER \
47185 1 0 Cash loans F
133243 0 0 Cash loans F
259367 0 0 Cash loans F
219323 0 0 Cash loans F
256066 0 1 Cash loans M
FLAG_OWN_CAR FLAG_DOCUMENT_2 FLAG_DOCUMENT_3 FLAG_DOCUMENT_4 \
47185 Y 0 1 0
133243 N 0 1 0
259367 N 0 1 0
219323 N 0 1 0
256066 Y 0 0 0
FLAG_DOCUMENT_5 FLAG_DOCUMENT_6 FLAG_DOCUMENT_7 FLAG_DOCUMENT_9 \
47185 0 0 0 0
133243 0 0 0 0
259367 0 0 0 0
219323 0 0 0 0
256066 0 0 0 0
FLAG_DOCUMENT_21 FLAG_DOCUMENT_10 FLAG_DOCUMENT_11 FLAG_OWN_REALTY \
47185 0 0 0 Y
133243 0 0 0 N
259367 0 0 0 N
219323 0 0 0 Y
256066 0 0 0 N
FLAG_DOCUMENT_13 FLAG_DOCUMENT_14 FLAG_DOCUMENT_15 FLAG_DOCUMENT_16 \
47185 0 0 0 0
133243 0 0 0 0
259367 0 0 0 0
219323 0 0 0 0
256066 0 0 0 0
FLAG_DOCUMENT_17 FLAG_DOCUMENT_18 FLAG_DOCUMENT_19 FLAG_DOCUMENT_20 \
47185 0 0 0 0
133243 0 0 0 0
259367 0 0 0 0
219323 0 0 0 0
256066 0 0 0 0
FLAG_DOCUMENT_12 FLAG_PHONE LIVE_CITY_NOT_WORK_CITY \
47185 0 0 0
133243 0 0 0
259367 0 0 0
219323 0 0 0
256066 0 0 0
REG_CITY_NOT_WORK_CITY TARGET REG_CITY_NOT_LIVE_CITY \
47185 0 1 0
133243 0 0 0
259367 0 0 0
219323 1 0 1
256066 1 0 1
LIVE_REGION_NOT_WORK_REGION REG_REGION_NOT_WORK_REGION \
47185 0 0
133243 0 0
259367 0 0
219323 0 0
256066 0 0
REG_REGION_NOT_LIVE_REGION HOUR_APPR_PROCESS_START \
47185 0 7
133243 0 11
259367 0 18
219323 0 10
256066 0 5
WEEKDAY_APPR_PROCESS_START REGION_RATING_CLIENT_W_CITY \
47185 FRIDAY 2
133243 MONDAY 2
259367 WEDNESDAY 2
219323 THURSDAY 2
256066 SATURDAY 2
REGION_RATING_CLIENT FLAG_EMAIL FLAG_CONT_MOBILE \
47185 2 0 1
133243 2 0 1
259367 2 0 1
219323 2 1 1
256066 2 0 1
ORGANIZATION_TYPE FLAG_WORK_PHONE FLAG_EMP_PHONE FLAG_MOBIL \
47185 Business Entity Type 3 0 1 1
133243 Self-employed 0 1 1
259367 Business Entity Type 3 0 1 1
219323 Medicine 0 1 1
256066 Military 0 1 1
NAME_HOUSING_TYPE NAME_FAMILY_STATUS \
47185 House / apartment Married
133243 House / apartment Single / not married
259367 House / apartment Married
219323 Office apartment Single / not married
256066 Office apartment Married
NAME_EDUCATION_TYPE NAME_INCOME_TYPE
47185 Secondary / secondary special Working
133243 Secondary / secondary special Working
259367 Secondary / secondary special Working
219323 Secondary / secondary special Working
256066 Secondary / secondary special State servant
Primeras filas del conjunto de prueba:
FONDKAPREMONT_MODE WALLSMATERIAL_MODE HOUSETYPE_MODE \
98871 SIN VALOR Stone, brick block of flats
133710 SIN VALOR Panel block of flats
165480 SIN VALOR SIN VALOR block of flats
33194 SIN VALOR SIN VALOR SIN VALOR
27344 SIN VALOR Panel block of flats
EMERGENCYSTATE_MODE OCCUPATION_TYPE NAME_TYPE_SUITE \
98871 No SIN VALOR Family
133710 No Private service staff Family
165480 No Laborers Unaccompanied
33194 SIN VALOR SIN VALOR Unaccompanied
27344 No Managers Unaccompanied
CNT_CHILDREN FLAG_DOCUMENT_8 NAME_CONTRACT_TYPE CODE_GENDER \
98871 0 0 Cash loans F
133710 0 1 Cash loans F
165480 0 0 Cash loans M
33194 0 0 Cash loans F
27344 0 0 Cash loans M
FLAG_OWN_CAR FLAG_DOCUMENT_2 FLAG_DOCUMENT_3 FLAG_DOCUMENT_4 \
98871 N 0 0 0
133710 Y 0 0 0
165480 N 0 1 0
33194 N 0 1 0
27344 N 0 1 0
FLAG_DOCUMENT_5 FLAG_DOCUMENT_6 FLAG_DOCUMENT_7 FLAG_DOCUMENT_9 \
98871 0 0 0 0
133710 0 0 0 0
165480 0 0 0 0
33194 0 0 0 0
27344 0 0 0 0
FLAG_DOCUMENT_21 FLAG_DOCUMENT_10 FLAG_DOCUMENT_11 FLAG_OWN_REALTY \
98871 0 0 0 Y
133710 0 0 0 N
165480 0 0 0 N
33194 0 0 0 Y
27344 0 0 0 Y
FLAG_DOCUMENT_13 FLAG_DOCUMENT_14 FLAG_DOCUMENT_15 FLAG_DOCUMENT_16 \
98871 0 0 0 0
133710 0 0 0 0
165480 0 0 0 0
33194 0 0 0 0
27344 0 0 0 0
FLAG_DOCUMENT_17 FLAG_DOCUMENT_18 FLAG_DOCUMENT_19 FLAG_DOCUMENT_20 \
98871 0 0 0 0
133710 0 0 0 0
165480 0 0 0 0
33194 0 0 0 0
27344 0 0 0 0
FLAG_DOCUMENT_12 FLAG_PHONE LIVE_CITY_NOT_WORK_CITY \
98871 0 0 1
133710 0 0 0
165480 0 0 0
33194 0 0 0
27344 0 1 0
REG_CITY_NOT_WORK_CITY TARGET REG_CITY_NOT_LIVE_CITY \
98871 1 0 0
133710 0 0 0
165480 1 0 1
33194 0 0 0
27344 0 0 0
LIVE_REGION_NOT_WORK_REGION REG_REGION_NOT_WORK_REGION \
98871 0 0
133710 0 0
165480 0 0
33194 0 0
27344 0 0
REG_REGION_NOT_LIVE_REGION HOUR_APPR_PROCESS_START \
98871 0 13
133710 0 10
165480 0 9
33194 0 10
27344 0 9
WEEKDAY_APPR_PROCESS_START REGION_RATING_CLIENT_W_CITY \
98871 WEDNESDAY 2
133710 FRIDAY 2
165480 TUESDAY 2
33194 TUESDAY 2
27344 MONDAY 2
REGION_RATING_CLIENT FLAG_EMAIL FLAG_CONT_MOBILE \
98871 2 0 1
133710 2 0 1
165480 2 0 1
33194 2 0 1
27344 2 0 1
ORGANIZATION_TYPE FLAG_WORK_PHONE FLAG_EMP_PHONE FLAG_MOBIL \
98871 Other 0 1 1
133710 Self-employed 0 1 1
165480 Business Entity Type 3 0 1 1
33194 XNA 0 0 1
27344 Government 1 1 1
NAME_HOUSING_TYPE NAME_FAMILY_STATUS NAME_EDUCATION_TYPE \
98871 House / apartment Married Secondary / secondary special
133710 House / apartment Married Secondary / secondary special
165480 Rented apartment Civil marriage Secondary / secondary special
33194 House / apartment Married Secondary / secondary special
27344 House / apartment Married Higher education
NAME_INCOME_TYPE
98871 Working
133710 Working
165480 Commercial associate
33194 Pensioner
27344 Working
Guardado de la tabla¶
df_application_input_train.to_csv("./data_preprocessing/train_pd_data_preprocessing_missing_outlier.csv", index=False)
df_application_input_train.to_csv("./data_preprocessing/test_pd_data_preprocessing_missing_outlier.csv", index=False)
# Verificar los resultados de la operación
print("Archivos CSV creados y guardados con éxito.")
Archivos CSV creados y guardados con éxito.
print(df_application_input_train.shape, df_application_input_test.shape)
(246008, 122) (61503, 122)
Por último, en esta sección se guardaron los DataFrames preprocesados en archivos CSV, indicando que el tratamiento de datos, análisis de correlaciones, manejo de valores missing y outliers se realizó con éxito. Este paso es crucial, ya que asegura que los datos están listos para futuras fases de modelado, manteniendo la calidad y la integridad de la información.